当前位置: 首页 > 知识库问答 >
问题:

PDFBOXjava.lang.OutOfMemoryError: java堆空间;超出GC开销限制

杭涵映
2023-03-14

我正在做一个Java项目。我从服务器检索pdf并将其转换为图像以将像素与预期文件进行比较。当我只使用20-30个文件运行该程序时,它很好,但当我尝试使用超过30个文件时,它会抛出OutOfMemoryError。

看起来像pdf-

    PDDocument document = null;
    try {
        document = PDDocument.loadNonSeq(new File(pdfFile), null);
        List<PDPage> pages = new ArrayList<PDPage>();
        for (Object obj : document.getDocumentCatalog().getAllPages()) {
            PDPage page = (PDPage) (obj);
            pages.add(page);
        }
        int pageNum = 0;
        for (PDPage pdPage : pages) {
            BufferedImage img = pdPage.convertToImage(BufferedImage.TYPE_INT_RGB, 100);
            if (isExpected) {
                ImageIOUtil.writeImage(img, FolderUtils.getImageFolder(websiteName) + File.separator + "expected"
                        + (++pageNum) + ".png", 100);
            } else {
                ImageIOUtil.writeImage(img, FolderUtils.getImageFolder(websiteName) + File.separator + "rendered"
                        + (++pageNum) + ".png", 100);
            }
            img.flush();
            img = null;
        }
    } catch (IOException e) {
        debugLog.log(Level.SEVERE, e.getMessage(), e);
    } finally {
        if (document != null) {
            try {
                document.close();
                document = null;
            } catch (IOException e) {
                debugLog.log(Level.SEVERE, e.getMessage(), e);
            }
        }
    }

下面是Java堆空间日志的一部分:

Exception in thread "pool-1-thread-1" java.lang.OutOfMemoryError: Java heap space
    at java.awt.image.DataBufferInt.<init>(DataBufferInt.java:75)
    at java.awt.image.Raster.createPackedRaster(Raster.java:467)
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1032)
    at java.awt.image.BufferedImage.<init>(BufferedImage.java:340)
    at org.apache.pdfbox.pdmodel.graphics.xobject.CompositeImage.createMaskedImage(CompositeImage.java:85)
    at org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage.applyMasks(PDXObjectImage.java:158)
    at org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMap.getRGBImage(PDPixelMap.java:367)
    at org.apache.pdfbox.util.operator.pagedrawer.Invoke.process(Invoke.java:87)
    at org.apache.pdfbox.util.PDFStreamEngine.processOperator(PDFStreamEngine.java:557)
    at org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:268)
    at org.apache.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.java:235)
    at org.apache.pdfbox.util.PDFStreamEngine.processStream(PDFStreamEngine.java:215)
    at org.apache.pdfbox.pdfviewer.PageDrawer.drawPage(PageDrawer.java:139)
    at org.apache.pdfbox.pdmodel.PDPage.convertToImage(PDPage.java:801)
    at ********************.convertPDFToImages(Processor.java:107)
    at ********************.APIProcessor.run(APIProcessor.java:62)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

以下是GC开销限制超出的日志部分:

Exception in thread "pool-1-thread-3" java.lang.OutOfMemoryError: GC overhead limit exceeded
    at java.util.Collections.singletonList(Collections.java:3349)
    at org.apache.pdfbox.pdfparser.NonSequentialPDFParser.parseDictObjects(NonSequentialPDFParser.java:1275)
    at org.apache.pdfbox.pdfparser.NonSequentialPDFParser.initialParse(NonSequentialPDFParser.java:414)
    at org.apache.pdfbox.pdfparser.NonSequentialPDFParser.parse(NonSequentialPDFParser.java:886)
    at org.apache.pdfbox.pdmodel.PDDocument.loadNonSeq(PDDocument.java:1273)
    at org.apache.pdfbox.pdmodel.PDDocument.loadNonSeq(PDDocument.java:1256)
    at *********************.convertPDFToImages(Processor.java:99)
    at ********************.APIProcessor.run(APIProcessor.java:62)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

此外,第一个Java堆空间错误发生在id22,第二个发生在id33。我在服务器上使用8GB RAM,MAVEN_OPTS=-d64-Xms500M-Xmx7000M-XX: PermSize=65M-XX: MaxPermSize=512M-XX: HeapDumpOnOutOfMemoryError-XX: HeapDumpPath=C:\Temp\heapDump.txt-Xdebug-Xrunjdwp:传输=dt_socket,地址=8123,服务器=y,挂起=n

我可以就我的代码出了什么问题寻求帮助吗?或者是什么导致了这里的问题?内存泄漏吗?

附言:这是JConsole渲染的pdf文件和屏幕截图的链接:https://www.dropbox.com/sh/86gxnmnk5gl66k6/AAAFE_lapBr3cH8EMlXu94qJa?dl=0

此外,我现在在8GB RAM服务器上运行该程序。但如果我在本地16GB RAM笔记本电脑上运行它,则不会出现java堆空间错误。

共有1个答案

鲁文昌
2023-03-14

我们在PDFBox图像转换方面也存在一些问题。它在缓冲图像中运行时确实会消耗大量堆空间,并且在增加生成的页面数量时会成为定时炸弹。

我们的解决方案是改变图书馆。我们确实在JPedal上取得了良好的性能,如果情况没有改变,他们确实有一个LGPL版本的框架。

 类似资料:
  • 什么是java。lang.OutOfMemoryError:Java堆空间意味着消息意味着应用程序只需要比正常运行可用的更多Java堆空间。 什么是java。lang.OutOfMemoryError:超出GC开销限制意味着由于某种原因,垃圾收集器占用了过多的时间(默认情况下占进程所有CPU时间的98%),每次运行时恢复的内存很少(默认情况下占堆的2%)。这在内部也意味着,当应用程序只需要比正常运

  • 使用当我尝试构建我的项目时,这种错误越来越多: 错误:任务“:app:CompiledEbugJavaWithJavac”执行失败。OutofMemoryError:超出GC开销限制 有什么办法解决这个问题吗?

  • 我正在尝试预处理一个大的txt文件(10G),并将其存储在二进制文件中以备将来使用。当代码运行时,速度会减慢,并以 异常线程"main"java.lang.OutOfMemoryError: GC开销限制超过 输入文件具有以下结构 这是我正在使用的代码: 基本上,它通过in文件并将数据存储到对象HMbicnt(这是一个哈希映射)。一旦在第二列中遇到新值,它应该将对象写入输出文件,释放内存并继续。

  • 当我在android中使用任何布局xml时,我都在与Java堆空间错误作斗争 我在SO上搜索,但错误仍然存在。我的错误日志 org.eclipse.platform - launcherXXMaxPermSize 1024m-launcher . default action openFile-launcher . appendvmargs-VM args-dosgi . requiredjava

  • 问题内容: 我正在尝试建立一个包含2台服务器的Gridgain集群。 使用 GridDataLoader 将.csv文件中的数据(100万至5000万个数据)加载到Gridgain 。 从加载的数据中找到最小值,最大值,平均值等, 当在Eclipse中作为独立应用程序运行时,我得到正确的输出。 但是,在建立集群(eclipse环境中的2个服务器中的2个节点+我的Eclipse环境中的1个节点)的同

  • 问题内容: 我在一个程序中创建了这个错误,该程序创建了几个(数十万)HashMap对象,每个对象都有几个(15-20)文本条目。这些字符串必须全部收集(不分解成较小的数量),然后再提交给数据库。 根据Sun的说法,该错误发生“如果在垃圾回收上花费了太多时间:如果在垃圾回收上花费了总时间的98%以上,而回收不到2%的堆,则将引发OutOfMemoryError。 ”。 显然,可以使用命令行将参数传递