标题翻译
Java Memory Issues while generating 3 different images in Jasper Report as Svg
问题
我在Jasper Reports中有3张图片,格式为png,这些图片是在函数调用期间生成的,每次都会动态传递所有参数。这之前是有效的。现在,当我将所有图片改为.svg格式时,Java中出现了内存问题。以下是日志记录:
PDF生成已启动。
2020-03-16 05:11:31,791 错误 o.a.c.c.C.[.[.[.[dispatcherServlet] - 在路径为[]的上下文中为servlet [dispatcherServlet] 提供服务时抛出异常 [处理程序分派失败;嵌套异常是java.lang.OutOfMemoryError:Java堆空间],根本原因是
java.lang.OutOfMemoryError:Java堆空间
at java.awt.geom.Path2D$Float.<init>(Path2D.java:233)
at java.awt.geom.GeneralPath.<init>(GeneralPath.java:73)
at org.apache.batik.ext.awt.geom.ExtendedGeneralPath.<init>(ExtendedGeneralPath.java:69)
at org.apache.batik.parser.AWTPathProducer.startPath(AWTPathProducer.java:116)
at org.apache.batik.dom.svg.SVGAnimatedPathDataSupport.handlePathSegList(SVGAnimatedPathDataSupport.java:59)
at org.apache.batik.bridge.SVGPathElementBridge.buildShape(SVGPathElementBridge.java:92)
...
我还添加了以下内容:
JRSwapFileVirtualizer virtualizer = null;
virtualizer = new JRSwapFileVirtualizer(2, new JRSwapFile("./", 2048, 1024));
virtualizer.setReadOnly(false);
Map<String, Object> reportTemplateOne = reportTemplates.getReportTemplateOne();
reportTemplateOne.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
reportTemplates.setReportTemplateOne(reportTemplateOne);
try
{
JasperPrint print = JasperFillManager.fillReport(jasperReport, reportTemplates.getReportTemplateOne(), DataSource());
virtualizer.cleanup();
return print;
}
catch(JRException | NullPointerException ex)
{
LOGGER.error("\n无法获取数据!!!由于编译报告而出现异常!!!");
ex.printStackTrace();
virtualizer.cleanup();
return null;
}
然而,内存问题仍未解决。这些图像的大小为12 MB、14 KB和20 KB。
在.jrxml文件中,所有图像都以以下模式使用batikRendered:<imageExpression><![CDATA[net.sf.jasperreports.renderers.BatikRenderer.getInstance(new org.apache.commons.codec.binary.Base64().decodeBase64($P{lEncodedImage}))]]></imageExpression>
。
英文翻译
I have 3 images as png in my Jasper Reports which is generated during a function call, which passes all parameters dynamically every time. This worked. Now when I made all my images to .svg, I get memory issues in Java. The following are the logs:
PDF Generation Started.
2020-03-16 05:11:31,791 ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: Java heap space] with root cause
java.lang.OutOfMemoryError: Java heap space
at java.awt.geom.Path2D$Float.<init>(Path2D.java:233)
at java.awt.geom.GeneralPath.<init>(GeneralPath.java:73)
at org.apache.batik.ext.awt.geom.ExtendedGeneralPath.<init>(ExtendedGeneralPath.java:69)
at org.apache.batik.parser.AWTPathProducer.startPath(AWTPathProducer.java:116)
at org.apache.batik.dom.svg.SVGAnimatedPathDataSupport.handlePathSegList(SVGAnimatedPathDataSupport.java:59)
at org.apache.batik.bridge.SVGPathElementBridge.buildShape(SVGPathElementBridge.java:92)
at org.apache.batik.bridge.SVGShapeElementBridge.createGraphicsNode(SVGShapeElementBridge.java:60)
at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(GVTBuilder.java:213)
at org.apache.batik.bridge.GVTBuilder.buildComposite(GVTBuilder.java:171)
at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(GVTBuilder.java:219)
at org.apache.batik.bridge.GVTBuilder.buildComposite(GVTBuilder.java:171)
at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(GVTBuilder.java:219)
at org.apache.batik.bridge.GVTBuilder.buildComposite(GVTBuilder.java:171)
at org.apache.batik.bridge.GVTBuilder.buildGraphicsNode(GVTBuilder.java:219)
at org.apache.batik.bridge.GVTBuilder.buildComposite(GVTBuilder.java:171)
at org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:82)
at net.sf.jasperreports.renderers.AbstractSvgDataToGraphics2DRenderer.getRootNode(AbstractSvgDataToGraphics2DRenderer.java:173)
at net.sf.jasperreports.renderers.AbstractSvgDataToGraphics2DRenderer.getDimension(AbstractSvgDataToGraphics2DRenderer.java:122)
at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.processGraphics2D(JRPdfExporter.java:1912)
at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.process(JRPdfExporter.java:1592)
at net.sf.jasperreports.engine.export.JRPdfExporter$InternalImageProcessor.access$300(JRPdfExporter.java:1542)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportImage(JRPdfExporter.java:1482)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportElements(JRPdfExporter.java:1100)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportPage(JRPdfExporter.java:1063)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportReportToStream(JRPdfExporter.java:927)
at net.sf.jasperreports.engine.export.JRPdfExporter.exportReport(JRPdfExporter.java:547)
at net.sf.jasperreports.engine.JasperExportManager.exportToPdfStream(JasperExportManager.java:196)
at net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfStream(JasperExportManager.java:533)
at com.cm.da.util.ReportProcessorUtil.pdfGenerator(ReportProcessorUtil.java:878)
at com.cm.da.controller.UIController.saveReport(UIController.java:607)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
I have also added:
JRSwapFileVirtualizer virtualizer = null;
virtualizer = new JRSwapFileVirtualizer(2, new JRSwapFile("./", 2048, 1024));
virtualizer.setReadOnly(false);
Map<String, Object> reportTemplateOne = reportTemplates.getReportTemplateOne();
reportTemplateOne.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
reportTemplates.setReportTemplateOne(reportTemplateOne);
try
{
JasperPrint print = JasperFillManager.fillReport(jasperReport, reportTemplates.getReportTemplateOne(), DataSource());
virtualizer.cleanup();
return print;
}
catch(JRException | NullPointerException ex)
{
LOGGER.error("\nData could not be fetched!!!As an exception has occured due to compiling the report!!!");
ex.printStackTrace();
virtualizer.cleanup();
return null;
}
Yet again the memory issue is not solving. The images are of 12 MB,14 KB, 20 KB.
Inside .jrxml file all the images are using batikRendered in the following pattern:<imageExpression><![CDATA[net.sf.jasperreports.renderers.BatikRenderer.getInstance(new org.apache.commons.codec.binary.Base64().decodeBase64($P{lEncodedImage}))]]></imageExpression>
专注分享java语言的经验与见解,让所有开发者获益!
评论