天天看點

【Itext】解決Itext5大并發大資料量下輸出PDF發生記憶體溢出outofmemery異常

尼瑪,這個問題幹擾了我兩個星期!!

關鍵字 itext5 outofmemery 記憶體溢出 大資料 高并發 多線程 pdf 導出 報表 itext 并發

在讀<<iText in Action 2nd>4.3節(Dealing with large tables)的時候,書上寫道:itext5PdfPTable實作了ILargElement的接口,隻需要我們手動設定datatable.setComplete(false);之後,它就可以自動将表格元素輸出到document中,但是,對,就是這個但是!!我們的cell之多,多到它來不及去放進去,比如我并發100個線程去通路它,别說tomcat受不了,was也照樣挂掉,給他8個G,它也照樣吃掉,而且服務卡死。你說這樣的産品放出去,我放心不?

于是,我大量Google,大量百度,大量Csdn,大量JavaEye,多少次的說多了都是淚,最後,yes,就是最後,我Tm什麼法子都想了,list清空,指針賦null,優化程式循環,優化bufferedOutPutStream輸出,優化下載下傳,就差給Itext作者寫信了!!現在解決了這個高并發的問題,可以邊生成邊輸出到IO磁盤,防止以前高并發,大家發生死鎖,圍着記憶體和IO卡死

或者

經過我的調試,發現一個問題:就是當你的前一頁最下方那一行無法裝下你的某行資料,需要換一頁寫入下一頁,就是拆分行的話,你強制進行splitRow(false),會發生資料丢失。是以建議不要去 不讓拆分表格 (或者你可以調大一些到1000行再去清理表格,别100行就清理,還不夠記憶體累的)。比如下面這樣是我推薦的方法,就讓他在上一頁一些,下一頁一些呗,而且這種極限的情況很少發生,比如如下的demo,那就是我在100個線程并發通路生成5800行*33列的情況下搞的一個比較另類的pdf,前一頁留一點,後一頁留一點使得列印的時候更加美觀,何必非要前一頁留那麼多空白:

1.清理緩存并換頁,第200行資料跑到了下一頁,199行之後留了空白出來。(此種不推薦)

【Itext】解決Itext5大并發大資料量下輸出PDF發生記憶體溢出outofmemery異常

2.清理緩存不換頁(推薦此種)事實證明,當你把fregmentSize的值上升到1000行一清理,就不會出現換頁的問題。大家量力而行把。

【Itext】解決Itext5大并發大資料量下輸出PDF發生記憶體溢出outofmemery異常

落雨(感謝無名兄給的很好的思路!!先添加了再删掉再添加。good)

394263788

2013年9月11日 10:04:12

繼續閱讀