1

我们有一个 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 解决了崩溃问题。可惜既没有提供特别准确的渲染......

4

1 回答 1

0

也许您的 JAVA_OPTS 没有被正确读取?以下内容就足够了:

set JAVA_OPTS=-XX:PermSize=256m -XX:MaxPermSize=256m
于 2013-02-28T00:12:27.727 回答