我在生成多个小型 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();
任何有关如何在生成每个报告后清理内存的建议都会很有帮助。
不确定 pojo 还是传统的 JSP Web 应用程序,但对于我的 Spring 应用程序,它曾经有相同的内存不足问题。我退出跟踪日志记录并找到很多有关渲染模板的信息。这让我想起jrxml
是一个预编译模板,而不是.jasper
。所以我更换了所有模板,然后内存不足问题就再也不会发生了。请将此视为对@Joop Eggen 建议的补充。
我是一名优秀的程序员,十分优秀!