PDFBox 2异常内存消耗

PDFBox 2 unusual memory consumption

我们正在尝试使用 PDFRenderer 的方法 renderImageWithDPI 渲染来自不同 PDF 文件的图像。在特定 PDF 上,对于某些页面,库渲染器具有不同的行为。

渲染本身比其他类似页面花费的时间更长,并且内存消耗达到异常大的值:进程消耗的内存每 1 - 2 秒增加约 50MB,直到达到 5GB 之类的值在 renderImageWithDPI 中应用程序进程消耗的 RAM。一旦线程完成 renderImageWithDPI,内存消耗几乎立即下降 1.5 - 2 GB。由于高内存消耗,有时会抛出 Java Heap Space 异常。

发生这种情况的页面与其他页面没有明显区别,具有相同的宽度、高度和磁盘大小。渲染是用 250 DPI 完成的, 图像类型 RGB。另外,应用程序是运行“-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider”参数。

这是内存泄漏还是预期行为?另外,有人可以解释为什么有些页面会占用 2GB 内存并需要 1 分钟才能呈现,而其他页面则需要几秒钟才能呈现吗?

对PDF的分析表明,第34页有超过10000个XObject元素,几乎都是CMYK图像。您可以通过 the PDFDebugger command line app, go to page 34, then resources, then XObject. Converting them is not very fast in java. Memory usage is most likely due to us caching these images. You can observe that the next time the page is shown, it is done much faster. Disabling the cache is shown in the FAQ.

自己查看

通过使用此选项,我还获得了一些速度提升(21 秒而不是 89 秒):-Dorg.apache.pdfbox.rendering.UsePureJavaCMYKConversion=true。但是图像质量可能略有不同,请参阅 PDFBOX-3569 进行讨论。