【问题标题】:PDFBox 2 unusual memory consumptionPDFBox 2 异常的内存消耗
【发布时间】:2017-04-08 01:33:25
【问题描述】:

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

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

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

这是内存泄漏还是预期行为?另外,有人能解释一下为什么有些页面会占用 2GB 内存并需要 1 分钟才能呈现,而另一些页面会在几秒钟内呈现出来?

【问题讨论】:

  • 你能分享有问题的pdf吗?
  • 你能给我你的电子邮件地址,以便我给你发送一个谷歌驱动器链接吗?
  • 可能是阴影,也可能是复杂的图案...请将链接也发送给 snafu dot de 的 tilman。
  • @Cristian 你可以在这里点击我的名字找到一个地址,mkl@... 但也可以发送给 Tilman,他是一个活跃的 pdfbox 开发者。
  • 您使用的是最新版本(2.0.5)吗?

标签: java pdfbox pdfrenderer


【解决方案1】:

对 PDF 的分析表明,第 34 页有超过 10000 个 XObject 元素,几乎都是 CMYK 图像。您可以使用the PDFDebugger command line app 自己查看此内容,转到第 34 页,然后是资源,然后是 XObject。在java中转换它们不是很快。内存使用很可能是由于我们缓存了这些图像。您可以观察到下一次显示页面时,它的完成速度要快得多。 FAQ 中显示了禁用缓存。

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

【讨论】:

  • 我们将尝试常见问题解答中的所有选项以及您提到的最后一个选项,并指出图像质量对我们来说实际上很重要。感谢您对理解此问题的支持。
  • 看了issues.apache.org/jira/browse/PDFBOX-3569后,我的理解是KcmsServiceProvider和UsePureJavaCMYKConversion不应该同时使用,因为它会减慢渲染速度。我们将只坚持使用 KcmsServiceProvider,因为我们无法根据一个 pdf 或另一个在两者之间切换。
  • 在我的情况下,同时使用这两种方法会更快。
  • @TilmanHausherr 你能看看这个stackoverflow.com/questions/51615758/…
猜你喜欢
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 2010-10-27
相关资源
最近更新 更多