【问题标题】:Appropriate Java Heap Size适当的 Java 堆大小
【发布时间】:2015-07-23 02:53:35
【问题描述】:

在尝试合并多个 PDF 文档时,我遇到了以下错误......

    PDFMerger failed with the following exception:
org.apache.pdfbox.exceptions.WrappedIOException
    at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:278)
    at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1220)
    at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1187)
    at org.apache.pdfbox.util.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:237)
    at org.apache.pdfbox.util.PDFMergerUtility.mergeDocuments(PDFMergerUtility.java:194)
    at org.apache.pdfbox.PDFMerger.merge(PDFMerger.java:82)
    at org.apache.pdfbox.PDFMerger.main(PDFMerger.java:44)
    at org.apache.pdfbox.PDFBox.main(PDFBox.java:83)

Caused by: java.lang.OutOfMemoryError: Java heap space
    at org.apache.pdfbox.io.RandomAccessBuffer.clone(RandomAccessBuffer.java:69)
    at org.apache.pdfbox.cos.COSStream.clone(COSStream.java:78)
    at org.apache.pdfbox.cos.COSStream.<init>(COSStream.java:102)
    at org.apache.pdfbox.pdfparser.BaseParser.parseCOSStream(BaseParser.java:409)
    at org.apache.pdfbox.pdfparser.PDFParser.parseObject(PDFParser.java:650)
    at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:203)
    ... 7 more

我认为显而易见的解决方案是增加堆空间(但我不确定)。该例程适用于 20-30 个文件,但在接近 100 个时会引发异常。

环境是一个带有 Java 1.8.0 的 apache2 Web 服务器,我正在通过 PHP exec() 调用命令...

    // Build a string for PDF box...
    $mergepdf = "java -jar pdfbox-app-1.8.9.jar PDFMerger ";

    foreach ($drawings as $key => $id){
        $mergepdf .= $path.$userid."-".$key.".pdf ";
    }

    $mergepdf .= $path.$pdffilename;

    // Make the compiled pdf
    exec($mergepdf);

用户可以请求他想要下载多少个 pdf。目的是合并它们并提供编译的 PDF。因为在编程时 PDF 的数量和大小是未知的(在更糟糕的情况下,计数可能超过 1,000 个,每个大小在 2M 到 30M 之间)。

将堆大小设置为的安全限制是什么,或者,我如何确定运行例程的适当堆大小 - 在执行时我可以期望它在 Web 服务器上具有哪些 imapact?把它调到最大有问题吗?

我在 Ec2 上使用 T2.micro 实例。

【问题讨论】:

  • 足以容纳你的一段字符串。
  • 没有简单的答案。这取决于您的 PDF 的大小和复杂性。

标签: java heap-memory


【解决方案1】:

最大堆大小是您宁愿程序失败而不是继续使用更多内存的点。这通常由您拥有的机器大小决定,即您可以将最大值设置为机器内存的 80%。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2023-03-12
    • 2012-12-07
    • 2013-01-26
    • 2017-08-21
    • 2016-04-25
    相关资源
    最近更新 更多