2015-09-28 3 views
3

Я работаю над проектом 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.

+0

Какую версию вы используете? Надеюсь, 1.8.10? –

+0

Я использую версию java 1.8.0_60. – DMeng

+0

Какая версия pdfbox? –

ответ

-2

У нас было несколько проблем с конвертированием изображений PDFBox. Он потребляет много кучного пространства, когда он проходит через буферизованные изображения и является бомбой замедленного действия, поскольку увеличивает количество сгенерированных страниц.

Наше решение изменило библиотеку. Мы получили хорошую производительность с JPedal, и, если что-то не изменилось, у них есть версия LGPL их фреймворка.

+4

Это не очень полезный ответ. Это похоже на то, что кто-то спрашивает о проблеме с его BMW и получает ответ «Получить Mercedes». (Раскрытие: я сторонник PDFBox) –

Смежные вопросы