我正在做一个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堆空间错误。
我们在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。 ”。 显然,可以使用命令行将参数传递