Я работаю над проектом Java. Я извлекаю pdf с сервера и конвертирую его в изображения для сравнения пикселей с ожидаемыми файлами. Программа прекрасна, когда я запускаю ее только с 20-30 файлами, но она бросает мне OutOfMemoryError, когда я пытаюсь использовать более 30 файлов.PDFBOX java.lang.OutOfMemoryError: java heap space; Верхний предел GC превышен
Похоже, что метод преобразования PDF -> создает OutOfMemoryError.
Вот метод:
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 Heap пространства:
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. Я использую ОЗУ 8 ГБ на сервере с MAVEN_OPTS=-d64 -Xms500M -Xmx7000M -XX:PermSize=65M -XX:MaxPermSize=512M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\Temp\heapDump.txt -Xdebug -Xrunjdwp:transport=dt_socket,address=8123,server=y,suspend=n
Могу ли я попросить некоторую помощь о том, что не так с моим кодом? Или что вызывает здесь проблему? Есть ли утечка памяти?
P.S .: Вот ссылка на оказанной PDF-файл и снимки экрана JConsole: https://www.dropbox.com/sh/86gxnmnk5gl66k6/AAAFE_lapBr3cH8EMlXu94qJa?dl=0
Кроме того, я теперь запустить программу на сервере RAM 8GB. Но если я запустил его на свой 16-гигабайтный оперативный ПК с ноутбуком на локальном компьютере, нет ошибки в области кучи java.
Какую версию вы используете? Надеюсь, 1.8.10? –
Я использую версию java 1.8.0_60. – DMeng
Какая версия pdfbox? –