Jasper Print - Java堆空间存储器

时间:2013-04-22 22:19:49

标签: java jvm jasper-reports

使用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)

2 个答案:

答案 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