我在生成多个小型PDF报告时面临内存不足问题(比如50000个报告,每个2-3页,文件大小为50到60 KB)。生成3000报告后我得到的内存不足错误。
执行下面的行之后,我看到内存没有被清除。
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 :(得分:1)
不确定pojo或传统的JSP Web应用程序,但是对于我的spring应用程序,它曾经有过相同的内存不足问题。我退出跟踪日志记录并找到有关渲染模板的大量信息。它让我记住jrxml
是预编译模板而不是.jasper
。所以我替换了所有模板,然后内存问题再也不会发生。请将此视为@Joop Eggen建议的补充。