Java JasperFillManager.fillReportToFile内存不足问题

Java JasperFillManager.fillReportToFile内存不足问题,java,jasper-reports,Java,Jasper Reports,我在生成多个小型PDF报告时面临内存不足的问题(例如50000份报告,每个报告2-3页,文件大小为50到60KB)。生成3000报告后出现的内存不足错误 在执行下面的行之后,我看到内存没有被清理 JasperFillManager.fillReportToFile(compiledPath, file.getPath(), null, dataSource); 我已经使用JRSwapFileVirtualizer尝试了下面的替代代码,但它没有帮助解决这个问题 dataSourc

我在生成多个小型PDF报告时面临内存不足的问题(例如50000份报告,每个报告2-3页,文件大小为50到60KB)。生成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
。所以我更换了所有的模板,然后内存不足的问题就再也不会发生了。请把这看作是JOP EGGEN建议的补充。 不确定pojo或传统的JSP web应用程序,但在我的spring应用程序中,它过去也有同样的内存不足问题。我退出了跟踪日志记录,找到了很多关于呈现模板的信息。它让我记住,
jrxml
是一个预编译模板,而不是
.jasper
。所以我更换了所有的模板,然后内存不足的问题就再也不会发生了。请把这看作是JOP EGGEN建议的补充。 例如,需要dispose,但这与第一个版本无关。你关闭了所有可以关闭的东西吗?@JoopEggen:最后取消了所有的对象。未找到任何可关闭的对象。cleanup()负责处理处置。我的场景是生成大量小文件,因此我想知道虚拟机是否有用。无论是否使用virtualizer,在执行最后一行后,我都看不到有多少内存被清理。@ad inf我可以问一下应用程序使用的模板文件是什么吗。jrxml和.jasper在性能上可能有巨大的差异。@Dreamer:using。jasper@ad-然后我认为最好的方法是打开日志记录到更详细的级别,通常在应用程序抛出“内存不足”之前会有相当大的一部分工作要做。例如,需要dispose,但这与第一个版本无关。你关闭了所有可以关闭的东西吗?@JoopEggen:最后取消了所有的对象。未找到任何可关闭的对象。cleanup()负责处理处置。我的场景是生成大量小文件,因此我想知道虚拟机是否有用。无论是否使用virtualizer,在执行最后一行后,我都看不到有多少内存被清理。@ad inf我可以问一下应用程序使用的模板文件是什么吗。jrxml和.jasper在性能上可能有巨大的差异。@Dreamer:using。jasper@ad-然后我认为最好的方法是打开日志记录到更详细的级别,通常在应用程序抛出“内存不足”之前会有相当大的一部分工作要做我将此作为答案,因为这通常是Jasper报告内存问题的解决方案。同时,我的问题是在循环中调用报表生成的代码,我可以对其进行纠正。我将此作为答案,因为这通常是Jasper报表内存问题的解决方案。同时,我的问题是在循环中调用报告生成的代码,我可以纠正它。