iTextSharp - 非常大的表内存泄漏

Posted

技术标签:

【中文标题】iTextSharp - 非常大的表内存泄漏【英文标题】:iTextSharp - very large table memory leak 【发布时间】:2012-12-31 11:43:26 【问题描述】:

我有一个SqlDataReader 正在读取一个大型记录集(大约 1M 记录),我正在尝试使用 iTextSharp 将其导出到 PDF 文档。 这是我的代码:

 if (reader.HasRows)
 
    int rowNum = 0;
    while (reader.Read())
    
       if (rowNum % 2 == 1)
          datatable.DefaultCell.GrayFill = 0.8f;
       else
          datatable.DefaultCell.GrayFill = 0.95f;
       if (meRes.Trans(Lang, "Dir", CompanyID).ToUpper() == "RTL")
          for (int i = reader.FieldCount - 1; i >= 0; i--)
          
             object o = reader[i];
             datatable.AddCell(new Phrase(o.ToString(), fntList));
          
       else
          for (int i = 0; i < reader.FieldCount; i++)
             
                object o = reader[i];
                datatable.AddCell(new Phrase(o.ToString(), fntList));
             
       rowNum++;
   
    myDocument.Add(datatable);
 

当我运行它时,它会导致严重的内存泄漏。 我可以采取哪些不同的措施来改善这一点?

【问题讨论】:

您为条件中的每个循环创建一个对象,例如object o = reader[i];。这可能是问题 我不认为这是问题,因为如果我在做datatable.AddCell(new Phrase(reader[i], fntList)); 它仍然会导致内存泄漏 在循环过程中,您将数据导出到数据表中,数据表是数据的内存表示。直到您的 mydocument.Add(datatable) 一切都累积在内存中。没有泄漏,只是设计不佳。 谢谢@mkl,你建议我应该做些什么来改进它? @VahidN 同时提出了一种方法。更多详细信息可从 iText in Action 第 2 版以及在线提供的示例中获得。 【参考方案1】:

您可以设置每页的行数以减少内存压力

if (rowNum>0 && table1.Rows.Count % 7 == 0) // 7 = number of rows per page

   pdfDoc.Add(table1);
   table1.DeleteBodyRows(); // free resources
   pdfDoc.NewPage();

【讨论】:

谢谢,听起来不错,但是有没有办法知道我们添加表格后同一页面中还剩下多少空间以防止出现大的空白? 在 pdfDoc.Add(table1) 之后,您将可以访问表格的高度值。从页面大小和边距减少它以计算空白空间的高度。

以上是关于iTextSharp - 非常大的表内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

内存泄漏与垃圾回收机制

分析 ThreadLocal 内存泄漏问题

内存泄漏和内存溢出的区别

Android开发常见的Activity中内存泄漏及解决办法

OpenGL VBO 会泄漏内存吗?

PowerPoint 2010 内存泄漏?