【发布时间】:2020-10-19 20:33:12
【问题描述】:
我有一个 20MB 和 9 页的 PDF 文档,我正在尝试将其转换为图像并将它们 FTP,我正在使用 pdfBox(2.0.16 版本)并且以下逻辑导致堆内存从小于 500 开始出现严重峰值MB一直到2000MB。我遵循了 pdf 框 (https://pdfbox.apache.org/2.0/faq.html#outofmemoryrrror) 的常见问题解答,但到目前为止它没有帮助。我从当前的 2.0.16 版本升级到 2.0.20,但这也没有解决问题。任何有关错误的指示都将对我解决此问题非常有帮助。 20 MB 文件的 1500 MB 内存增加很多,我正在通过 tomcat 运行我的应用程序,它使服务器崩溃。
P.S:如果有任何其他我可以做的事情或更多细节,请告诉我。
代码:
PDDocument document = PDDocument.load(sourceFile,
MemoryUsageSetting.setupTempFileOnly());
PDFRenderer renderer = new PDFRenderer(document);
PDPageTree pdPageTree = document.getDocumentCatalog().getPages();
int pageNumber = 1;
strPdfFileName = strPdfFileName.replace(" ", "_");
UploadFileBuilder objUploadFileBuilder;
BufferedImage image;
File outputFile;
for (int i = 0; i < pdPageTree.getCount(); i++) {
strUploadFileName = new StringBuilder(strPdfFileName);
strUploadFileName.append("_").append(pageNumber).append(".png");
image = renderer.renderImage(pageNumber-1);
outputFile = new File(strPdfFilePath + File.separator + strPdfFileName +"_"+ pageNumber +".png");
LOGGER.debug("Image Created ----> {}", outputFile.getName());
ImageIO.write(image, "png", outputFile);
image.flush();
objUploadFileBuilder=new UploadFileBuilder();
objUploadFileBuilder.on(strUploadFileName.toString()).path(strFtpDir.toString()).withData(outputFile.getAbsolutePath());
lstUploadFileBuilder.add(objUploadFileBuilder);
strFileNameList.add(strUploadFileName.toString());
pageNumber++;
}
document.close();
UploadFileBuilder.execute(lstUploadFileBuilder);
Edit1:问题的堆栈跟踪,还进行了更改以刷新图像。
Edit2:当前 -XMX 设置(JVM 的最大内存分配池为 512m),我使用的是 java 1.8.0_91
【问题讨论】:
-
可以分享PDF吗?您可以尝试的另一件事是调用 renderer.setSubsamplingAllowed(true)。
-
@TilmanHausherr 抱歉它的 20MB,我无法上传,但这是我从开放互联网 hq.nasa.gov/alsj/a17/A17_FlightPlan.pdf 测试的 PDF 之一,我会尝试您建议的选项。
-
@TilmanHausherr 在尝试该选项后,我仍然看到内存峰值。我无法上传,但这是我从开放互联网 hq.nasa.gov/alsj/a17/A17_FlightPlan.pdf 测试的 PDF 之一
-
我能够在 jdk1.8.0_252 (amazon corretto) 上使用 -Xmx1g 和该文件运行 PDFToImage。确保您使用的是最新的 jdk,尤其是在使用 jdk8 时。 jdk11 和 14 使用的内存也更少。完成图像后也尝试添加“image.dispose()”。
-
是的,这是一个问题。错误得到修复(这包括内存泄漏),安全漏洞得到修复。并确保 tomcat 也已更新(如果适用)。以下是您不更新软件时发生的情况的示例:en.wikipedia.org/wiki/2017_Equifax_data_breach
标签: tomcat memory-leaks out-of-memory pdfbox heap-memory