【发布时间】: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