Java Проблемы с памятью при создании 3 разных изображений в отчете Jasper как Svg - PullRequest
1 голос
/ 16 марта 2020

У меня есть 3 изображения в виде png в моих отчетах Jasper, которые генерируются во время вызова функции, которая каждый раз динамически передает все параметры. Это сработало. Теперь, когда я сделал все свои изображения в .svg, у меня возникают проблемы с памятью в Java. Вот журналы:

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)

Я также добавил:

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;    
          }

И снова проблема с памятью не решается. Изображения имеют размер 12 МБ, 14 КБ, 20 КБ. Внутри файла .jr xml все изображения используют batikRendered по следующей схеме: <imageExpression><![CDATA[net.sf.jasperreports.renderers.BatikRenderer.getInstance(new org.apache.commons.codec.binary.Base64().decodeBase64($P{lEncodedImage}))]]></imageExpression>

...