Jasper Print – Java堆空间存储器

我使用Jasper Reports生成报告。 但是我从数据库获得了大量数据。 在执行Jasper打印以填充报表数据时,它会占用大量内存并导致Java堆空间内存问题。

JasperPrint jasperPrint = JasperFillManager.fillReport( jasperReport, params, dataSource); 

这条线需要花费很多时间并且会出错。 请帮帮我,如何摆脱这个问题。

 Stackrace : java.lang.OutOfMemoryError: Java heap space at net.sf.jasperreports.engine.fill.JRFillTextField.fill(JRFillTextField.java:691) at net.sf.jasperreports.engine.fill.JRFillElementContainer.fillElements(JRFillElementContainer.java:570) at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:390) at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:351) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2039) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:771) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportContent(JRVerticalFiller.java:301) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:148) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:909) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:841) at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:88) at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:653) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:969) at com.jci.eprt.web.controller.report.ReportController.previewEngineeringReport(ReportController.java:250) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.jci.eprt.service.utility.helper.JCIUserFilter.doFilter(JCIUserFilter.java:39) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 

当您处理具有大量结果集的报表时,这是一个常见问题。 一个明显的解决方案是不要立即读取整个结果集,而是尝试逐步读取它。

Java DevZone:在JasperReports中生成巨大的报告中提供了有关处理此问题的详细说明。 本参考文献中写了几行:

在为巨大的数据集实现Jasper Reports以有效处理内存时,需要注意一些事项,以便应用程序不会耗尽内存。

他们是:

1)数据的分页和JRDataSource的使用,

2)报告的病毒化。

Tomcat Web服务器经常会遇到java.lang.OutOfMemoryError:PermGen空间,无论何时部署 – 取消部署Web应用程序几次。 无论您使用的是tomcat6,tomcat7还是在Netbeans或Eclipse中使用捆绑的tomcat,您都会在tomcat服务器上开发Web应用程序时遇到此错误。

尝试增加堆的PermGen空间。 你可以参考这个链接