1

在生成多个小型 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();

任何关于如何在生成每个报告后清理内存的建议都会有所帮助。

4

1 回答 1

1

不确定 pojo 或传统的 JSP Web 应用程序,但是对于我的 spring 应用程序,它曾经有同样的内存不足问题。我退出了跟踪日志并找到了很多关于渲染模板的信息。它让我记得这jrxml是一个预编译模板,而不是.jasper. 所以我替换了我所有的模板,然后内存不足的问题就再也不会发生了。请将此视为对@Joop Eggen 建议的补充。

于 2013-02-05T22:19:44.403 回答