2

我正在使用 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)
4

2 回答 2

2

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

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

在为大型数据集实施 Jasper Reports 以有效处理内存时,需要注意一些事项,以免应用程序内存不足。

他们是:

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

2)报告的虚拟化。

于 2013-04-22T22:32:45.280 回答
0

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

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

于 2013-04-23T05:08:08.497 回答