【Itext】解决Itext5大并发大数据量下输出PDF发生内存溢出outofmemery异常
尼玛,这个问题干扰了我两个星期!!
关键字 itext5 outofmemery 内存溢出 大数据 高并发 多线程 pdf 导出 报表 itext 并发
在读<
于是,我大量Google,大量百度,大量Csdn,大量Ja vaEye,多少次的说多了都是泪,最后,yes,就是最后,我Tm什么法子都想了,list清空,指针赋null,优化程序循环,优化bufferedOutPutStream输出,优化下载,就差给Itext作者写信了!!现在解决了这个高并发的问题,可以边生成边输出到IO磁盘,防止以前高并发,大家发生死锁,围着内存和IO卡死
然后无名小卒兄居然也碰到了这个问题,而且这个博客我都不知道自己是怎么搜到的。他在处理中用到了一个自己写的方法:根据行号来控制执行次数。比如可以定义为
每 1000 行释放一次 table
datatable.setComplete(false)
table.deleteBodyRows();
table.setSkipFirstHeader(true);
int _MAX_ROWS = 1000;//最大行数,之后清理 int row_count = 0;//初始值 if ( row_count % _MAX_ROWS == 0) {System.out.println("row_count % _MAX_ROWS=" row_count % _MAX_ROWS);// add table to Document document.add(datatable); // delete _MAX_ROWS from table to free memory datatable.deleteBodyRows();// let iText manage when table header written //datatable.setSkipFirstHeader(true);
}或者
int fregmentSize = 1000;// 释放内存的行号int k = 0;for (int i = 0, h = bodys.size(); i < h; i ) { if (i != 0 && i % fregmentSize == fregmentSize - 1) {System.out.println("第[ " (i 1) " ]行进行内存释放 " ((k ) 1) " th");document.add(datatable);datatable.deleteBodyRows();datatable.setSkipFirstHeader(true);} //.... 表格处理} 经过我的实际调试,我发现一个比较容易踩坑的问题:如果前一页最下方的剩余空间已经放不下某一整行数据,写入时就必须换到下一页;这种情况下如果你强制使用splitRow(false)来禁止拆分行,
就很可能出现数据丢失
1.清理缓存并换页,第200行数据跑到了下一页,199行之后留了空白出来。(此种不推荐)

2.清理缓存不换页(推荐此种)事实证明,当你把fregmentSize的值上升到1000行一清理,就不会出现换页的问题。大家量力而行把。

落雨(感谢无名兄给的很好的思路!!先添加了再删掉再添加。good)
394263788
2013年9月11日 10:04:12