2013-02-05 165 views
1

我正在面臨內存不足問題,同時生成多個小型PDF報告(比如50000報告,每個2-3頁,文件大小爲50到60 KB)。 3000報告生成後出現內存不足錯誤。JasperFillManager.fillReportToFile內存不足問題

執行下面的行後,我看到內存沒有被清理乾淨。

JasperFillManager.fillReportToFile(compiledPath, 
     file.getPath(), null, dataSource); 

我已經使用JRSwapFileVirtualizer嘗試了下面的備用代碼,但它沒有幫助解決問題。

dataSource = new JRBeanArrayDataSource(myBean); 
swapFile = new JRSwapFile(outputFileLocation, 1024, 1024); 
virtualizer = new JRSwapFileVirtualizer(3,swapFile, true); 

parameterMap = new HashMap(); 
parameterMap.put(JRParameter.REPORT_VIRTUALIZER, virtualizer); 


JasperFillManager.fillReportToFile(compiledPath, 
     file.getPath(), parameterMap, dataSource); 

dataSource = null; 
virtualizer.cleanup(); 

jasperPrint = (JasperPrint) JRLoader.loadObject(file); 

compiledPath = null; 
file = null; 


pdfExporter = new JRPdfExporter(); 
pdfExporter.setParameter(JRExporterParameter.JASPER_PRINT, 
    jasperPrint); 
pdfExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, 
    finalOutputfile.toString()); 

pdfExporter.exportReport(); 

任何有關如何在每個報告生成後清理內存的建議將會有所幫助。

+0

[JRSwapFile](http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/util/JRSwapFile.html)需要一個配置,但不涉及第一個版本。你關閉所有的東西嗎? –

+0

@JoopEggen:最終清除每個對象。沒有找到任何可關閉的對象。 virtualizer.cleanup()負責處理。我的場景是生成大量小文件,因此想知道Virtualizer是否有用。無論是否有虛擬化器,在執行最後一行後,我都沒有看到太多的內存被清理乾淨。 –

+0

@ ad-inf我可以問你用於你的應用程序的模板文件嗎? .jrxml和.jasper在性能上可能會有很大差異。 – Dreamer

回答

1

不確定pojo或傳統的JSP web應用程序,但對於我的spring應用程序,它曾經有相同的內存不足問題。我退出了跟蹤日誌記錄,並找到了很多關於渲染模板的信息。它讓我記得jrxml是一個預編譯模板,而不是.jasper。所以我更換我的所有模板,然後內存不足問題再也不會發生。請認爲這是@Joop Eggen的建議的補充。

+0

我將此作爲答案,因爲這通常是Jasper報告內存問題的解決方案。同時我的問題是在一個循環中調用報告生成的代碼,我可以糾正這個問題。 –