适当的Java堆大小

时间:2015-07-23 02:53:36

标签: java heap

在尝试合并多个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

我认为显而易见的解决方案是增加堆空间(但我不确定)。 Routine可以处理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的数量和大小是未知的(在更糟糕的情况下,每个大小在2M到30M之间,计数可能超过1,000)。

设置堆大小的安全限制是什么,或者,如何确定运行我的例程的适当堆大小 - 我可以期望在执行时Web服务器上有什么样的imapacts?是否存在将其启动到最大程度的问题?

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

1 个答案:

答案 0 :(得分:2)

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