使用Jasper Reports生成报告。但我有来自数据库的大量数据。执行Jasper打印以填充报表数据时,会占用大量内存并导致Java Heap Space内存问题。
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)
答案 0 :(得分:2)
当您处理具有大量结果集的报告时,这是一个常见问题。一个显而易见的解决方案是不要立即读取整个结果集,而是尝试逐步读取它。
Java DevZone: Generating Huge reports in JasperReports中提供了有关处理此问题的详细说明。本参考文献中写了几行:
在为大型数据集实现Jasper Reports时,有一些事情需要注意,以便有效地处理内存,以便应用程序不会内存不足。
他们是:
1)数据的分页和JRDataSource的使用,
2)报告的病毒化。
答案 1 :(得分:0)
Tomcat Web服务器经常会遇到java.lang.OutOfMemoryError:PermGen空间,每当您部署 - 取消部署Web应用程序几次时。无论您使用的是tomcat6,tomcat7还是在Netbeans或Eclipse中使用捆绑的tomcat,您都会在tomcat服务器上开发Web应用程序时遇到此错误。
尝试增加堆的PermGen空间。你可以参考这个Link