【问题标题】:outofmemory exception when using pdfreader itext version 5.5.0使用 pdfreader itext 5.5.0 版时出现内存不足异常
【发布时间】:2022-01-20 16:52:59
【问题描述】:

使用 pdfreader.(itext) 阅读 pdf 时遇到一个奇怪的问题

PdfReader reader = PdfReader(bytearray).

线程“主”java.lang.OutOfMemoryError 中的异常:Java 堆空间 在 java.util.Arrays.copyOf(Arrays.java:3236) 在 java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118) 在 java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93) 在 java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153) 在 com.itextpdf.text.pdf.PdfReader.FlateDecode(PdfReader.java:2071) 在 com.itextpdf.text.pdf.PdfReader.FlateDecode(PdfReader.java:1926) 在 com.itextpdf.text.pdf.FilterHandlers$Filter_FLATEDECODE.decode(FilterHandlers.java:108) 在 com.itextpdf.text.pdf.PdfReader.decodeBytes(PdfReader.java:2476) 在 com.itextpdf.text.pdf.PdfReader.decodeBytes(PdfReader.java:2424) 在 com.itextpdf.text.pdf.PdfReader.getStreamBytes(PdfReader.java:2489) 在 com.itextpdf.text.pdf.PdfReader.readObjStm(PdfReader.java:1430) 在 com.itextpdf.text.pdf.PdfReader.readDocObj(PdfReader.java:1365) 在 com.itextpdf.text.pdf.PdfReader.readPdf(PdfReader.java:672) 在 com.itextpdf.text.pdf.PdfReader.(PdfReader.java:181) 在 com.itextpdf.text.pdf.PdfReader.(PdfReader.java:250) 在 com.itextpdf.text.pdf.PdfReader.(PdfReader.java:240)

pdf 大约 20 兆字节。奇怪的是,这在我的旧电脑上于 2020 年有效。几个月前我换了电脑。突然出现这个错误。有什么想法吗 ?我在intellij中试过这个,没有luck.intellij配置看起来像这样。 intellij 2019.3.5 社区版

> -Xms512m
> -Xmx820m
> -XX:ReservedCodeCacheSize=1024m
> -XX:+UseConcMarkSweepGC
> -XX:SoftRefLRUPolicyMSPerMB=50
> -ea
> -XX:CICompilerCount=2
> -Dsun.io.useCanonPrefixCache=false
> -Djava.net.preferIPv4Stack=true
> -Djdk.http.auth.tunneling.disabledSchemes=""
> -XX:+HeapDumpOnOutOfMemoryError
> -XX:-OmitStackTraceInFastThrow
> -Djdk.attach.allowAttachSelf=true
> -Dkotlinx.coroutines.debug=off
> -Djdk.module.illegalAccess.silent=true

有什么想法吗?我正在使用 Windows 10、64 位系统-java 8

【问题讨论】:

  • 从堆栈跟踪中可以清楚地看出,PdfReader 正在复制您的字节数组,有效地使内存使用量增加了一倍(或更可能是三倍)。考虑将 other than a byte array 传递给 PdfReader 构造函数。
  • 试试-Xmx1500m,你为什么要使用这么大的代码缓存大小?您可以轻松地减半(甚至更多)。获得印象启动 jconsole 并选择代码缓存...
  • @Lonzak 减少 xmx 工作,感谢 lonzak
  • @Parameswar 好的,我将其添加为答案,以便您接受它...
  • @VGR “从堆栈跟踪中可以清楚地看出 PdfReader 正在复制您的字节数组” - 这并不完全清楚。堆栈跟踪讨论了正在解压缩的 pdf 中的单个对象流。但实际上,根据构造函数中是否请求部分模式,可能会将整个文件解析为pdf的对象模型。

标签: java memory itext out-of-memory heap-memory


【解决方案1】:

将我的评论转换为答案,因为 OP 说它有助于解决问题:

使用-Xmx1500m 增加堆(甚至增加到-Xmx2048m)。

附注:为什么要使用如此巨大的代码缓存大小?您可以轻松地将 -XX:ReservedCodeCacheSize=512m 减半(甚至更多 -XX:ReservedCodeCacheSize=256m)。要了解您真正需要的内容,您可以使用 jconsole 并选择 code cache 部分。

【讨论】:

    猜你喜欢
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    相关资源
    最近更新 更多