Java内存问题,在生成Jasper报表时生成3种不同图像为Svg时发生问题。

huangapple 未分类评论44阅读模式
标题翻译

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:&lt;imageExpression&gt;&lt;![CDATA[net.sf.jasperreports.renderers.BatikRenderer.getInstance(new org.apache.commons.codec.binary.Base64().decodeBase64($P{lEncodedImage}))]]&gt;&lt;/imageExpression&gt;

英文翻译

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.&lt;init&gt;(Path2D.java:233)
	at java.awt.geom.GeneralPath.&lt;init&gt;(GeneralPath.java:73)
	at org.apache.batik.ext.awt.geom.ExtendedGeneralPath.&lt;init&gt;(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(&quot;./&quot;, 2048, 1024));
		virtualizer.setReadOnly(false);
		Map&lt;String, Object&gt; 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(&quot;\nData could not be fetched!!!As an exception has occured due to compiling the report!!!&quot;);
				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:&lt;imageExpression&gt;&lt;![CDATA[net.sf.jasperreports.renderers.BatikRenderer.getInstance(new org.apache.commons.codec.binary.Base64().decodeBase64($P{lEncodedImage}))]]&gt;&lt;/imageExpression&gt;

huangapple
  • 本文由 发表于 2020年3月16日 19:19:18
  • 转载请务必保留本文链接:https://java.coder-hub.com/60704998.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定