java - Jasper 报告内存不足问题

标签 java jasper-reports out-of-memory

我试图通过从数据库获取数据并将 pojo 集合列表传递给 JRBeanCollectionDataSource 来生成 Excel 报告。尝试生成包含 5000 条记录和 8 个字段的 Excel,出现内存不足问题。

我尝试了 JRFileVirtualizer 但没有运气,任何人都可以帮助我摆脱这个 OutOfMemory 问题。下面是我的代码

public class JasperReport  {

    public static void main(String [] args) throws Exception{
        DBtoExcelDownloadDAO d = new DBtoExcelDownloadDAO();
        List<ExcelDownloadPojo>  results=d.getDBrecordsForDownload(168);

        net.sf.jasperreports.engine.JasperReport jasperReport = JasperCompileManager
                   .compileReport("C:\\Users\\vkode200\\Networksolve_Report.jrxml");

        String outputFileName = "C:\\Users\\vkode200\\Downloads\\Output\\person.xls";
        JRFileVirtualizer virtualizer = new JRFileVirtualizer(1, "C:\\Users\\vkode200\\Reports");
      JasperPrint  jasperPrint = JasperFillManager.fillReport(jasperReport, (Map) getParameters(virtualizer),
                new JRBeanCollectionDataSource(
                        findReportData(results),false));
        JRXlsExporter exporterXls = new JRXlsExporter();

        exporterXls.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint);
        exporterXls.setParameter(JRXlsExporterParameter.OUTPUT_FILE_NAME, outputFileName);

exporterXls.setParameter(JRXlsExporterParameter.IS_AUTO_DETECT_CELL_TYPE, Boolean.TRUE);
        exporterXls.exportReport();
    }

    private static Collection findReportData(List<ExcelDownloadPojo> results) throws FileNotFoundException, IOException {
        List<JasperPojo> list = SampleExcel.generateExcel(results);
        return list;
    }

    private static Object getParameters(JRFileVirtualizer virtualizer ) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("footerText", "Just to demonstrate how to pass parameters to report");
        params.put("Title", "NETWORK_SOLVE");
        params.put(JRParameter.REPORT_VIRTUALIZER,virtualizer);
        return params;
    }
}
<小时/>

错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at org.apache.poi.hssf.usermodel.HSSFWorkbook.getBytes(HSSFWork‌​book.java:1393) at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkboo‌​k.java:1292)

最佳答案

如果您无法减少数据量,那么您应该增加应用程序分配的堆以防止异常。由于我不知道您的应用程序是如何工作的,因此有一些方法可以解决此问题:

<小时/>

命令

可以使用命令行选项增加分配给 JVM 的堆大小

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

java -Xms256m -Xmx2048m ClassName
<小时/>

NetBeans

右键单击项目 -> 属性 -> 运行

Project properties

<小时/>

Tomcat

setenv.shsetenv.bat 在启动时执行。如果 $CATALINA_HOME/bin/

中不存在该文件,则创建该文件

对于 Linux,创建 setenv.sh 并添加

export JAVA_OPTS="-server -Xmx2048m"

对于 Windows,创建 setenv.bat 并添加

set JAVA_OPTS=-server -Xmx2048m

根据您的需要更改 Xmx 值。

关于java - Jasper 报告内存不足问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45638279/

相关文章:

java.lang.OutOfMemoryError : Java heap space when stitching 13k . png 图像在一起

Java正则表达式匹配以固定标签开头的多行记录

java - ireport4 java.lang.ClassNotFoundException : org. apache.batik.svggen.SVGGraphics2DIOException

java - 违反完整性约束 (...) - 找到子记录、Java、Oracle、Hibernate

jasper-reports - 如何在 Jasper Report 中组织框架,使其完美 float ?

xml - 如何在 jasper 中反转子报表的 xpath?

android - Android 7.x 上的 Samsung Galaxy 设备出现大量 OutOfMemoryError

xml - LINQPad 抛出 System.OutOfMemoryException

java - 为什么使用 @PreUpdate 调用 EntityManager.merge 方法不会返回更新的实体?

java - 处理程序之前的函数 spring 3