我们有一个 5kb 的 .docx 文件被读入 Docx4j-2.8.1,然后转换为 PDF。在单元测试中这是可行的,但是一旦部署到 Tomcat 7(实际上是 TomEE-1.6.0-SNAPSHOT)中,我们在执行 PDF 转换时会出现 Permgen 空间错误。
示例代码:
wordMLPackage = WordprocessingMLPackage.load(inputStream);
final PdfConversion pdfConvertor = new Conversion(wordMLPackage);
pdfConvertor.output(stream, null);
return stream.toByteArray();
inputStream 是从 .docx 文件的 byte[] 创建的。docx 文件本身是一个单页,只有 Times New Roman 中的文本和几个要点(仅供示例使用)。
堆栈跟踪如下(我已将堆大小添加到顶部的日志中):
https://gist.github.com/jmkgreen/5046890
这台机器有 6GB 的 RAM,Tomcat 有以下设置:
set JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1536m -Xmx2048M -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=1024m -XX:MaxPermSize=4096m -XX:+DisableExplicitGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"
我不希望看到这个错误。一些建议将不胜感激。
编辑:在调用 PDF 转换器之前,我从 MemoryPoolMXBean 中为 Perm Gen 添加了 getUsage().getMax():82MB。
我还将 JAVA_OPTS 的 tomcat catalina.bat 文件条目减少到:
set JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -XX:MaxPermSize=4096m -XX:+DisableExplicitGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled"
编辑 2:从 docx4j 切换到 XDocReport 解决了崩溃问题。可惜既没有提供特别准确的渲染......