Java 通过itext生成pdf时内存不足堆空间错误

Java 通过itext生成pdf时内存不足堆空间错误,java,html,pdf,itext,Java,Html,Pdf,Itext,我正在尝试解析html模板,并使用itex库将其转换为pdf。它在登台和qa中运行良好,但在生产中抛出内存不足错误。下面是示例代码 String template = null; Document document = null; HTMLWorker htmlWorker; OutputStream outputStream = null; document = new Document(); document.open(); document.addTitle("S

我正在尝试解析html模板,并使用itex库将其转换为pdf。它在登台和qa中运行良好,但在生产中抛出内存不足错误。下面是示例代码

 String template = null;
  Document document = null;
  HTMLWorker htmlWorker;
  OutputStream outputStream = null;
  document = new Document();
  document.open();
  document.addTitle("SeatSeller Agent Invoice");
  document.addHeader("Content-Disposition", "attachment");
  document.addHeader("name", "redbusTicket");
  document.addHeader("filename", "test.pdf");
  document.addHeader("Content-Type", "application/pdf");
  document.addHeader("Content-ID", "test.pdf");
  document.addHeader("Content-Description", "SeatSellerInvoice.pdf");
  htmlWorker = new HTMLWorker(document);
  Handlebars handlebars = new Handlebars();
  String filePath = null;

    template = handlebars.compile("invoicepdftemplate").apply(creditInvoice);
    filePath = creditInvoice.getAccount().toString() + "_"
        + MMM_FORMATTER.format(creditInvoice.getDate())
        + YYYY_FORMATTER.format(creditInvoice.getDate()) + ".pdf";


  htmlWorker.parse(new StringReader(template));

  document.close();

  outputStream = new FileOutputStream(filePath);

  ITextRenderer iTextRenderer = new ITextRenderer();
  iTextRenderer.setDocumentFromString(template);
  iTextRenderer.layout();
  iTextRenderer.createPDF(outputStream);
  File fileToBeUploaded = new File(filePath);
下面是错误的堆栈跟踪-:

java.lang.OutOfMemoryError: Java heap space
    at com.lowagie.text.pdf.codec.PngImage.decodeIdat(Unknown Source) ~[itext-2.1.7.jar:na]
    at com.lowagie.text.pdf.codec.PngImage.getImage(Unknown Source) ~[itext-2.1.7.jar:na]
    at com.lowagie.text.pdf.codec.PngImage.getImage(Unknown Source) ~[itext-2.1.7.jar:na]
    at com.lowagie.text.pdf.codec.PngImage.getImage(Unknown Source) ~[itext-2.1.7.jar:na]
    at com.lowagie.text.Image.getInstance(Unknown Source) ~[itext-2.1.7.jar:na]
    at com.lowagie.text.Image.getInstance(Unknown Source) ~[itext-2.1.7.jar:na]
    at com.lowagie.text.html.simpleparser.HTMLWorker.startElement(Unknown Source) ~[itext-2.1.7.jar:na]
    at com.lowagie.text.xml.simpleparser.SimpleXMLParser.processTag(Unknown Source) ~[itext-2.1.7.jar:na]
    at com.lowagie.text.xml.simpleparser.SimpleXMLParser.go(Unknown Source) ~[itext-2.1.7.jar:na]
    at com.lowagie.text.xml.simpleparser.SimpleXMLParser.parse(Unknown Source) ~[itext-2.1.7.jar:na]
    at com.lowagie.text.html.simpleparser.HTMLWorker.parse(Unknown Source) ~[itext-2.1.7.jar:na]

代码中是否存在内存泄漏或任何问题。生产机器内存为Xms-256 Xmx-365。是否有人可以提供帮助; 此处:-outputStream在代码中未关闭。 请检查一次,或者使用资源实现try


问题是我在html模板中使用了400KB大小的图像,而生产机器的内存非常少。所以在解析html文件时,它抛出了内存不足错误。

在哪一行得到了OOME?共享stacktrace。除了手头的问题,您正在使用HTMLWorker。2011年被XMLWorker取代。请遵循适当的iText示例。您创建了一个iText文档,但没有附加一个编写器,因此您可以在任何地方编写PDF。然后分别使用一个ITextRenderer,它不是iText的一部分,而是其他库使用的iText功能的包装器。此外,考虑更新。iText 2.1.7非常古老。365Mb现在相当低。您是否尝试增加此值?您可以配置JVM在OOME上执行heapdump吗?这肯定会揭示问题的根本原因。FileOutputStream不需要消耗堆内存。关闭它将只释放FD@rkosegi,那么为什么OutputStream实现Closeable?因为它需要关闭FD。顺便说一句,检查源代码。实现AutoCloseable并不意味着您的对象正在消耗大量堆。这是关于关闭资源的一般约定。