我正在使用jMagick for java来处理上传的文件(图像和pdf文件)。大多数图像工作正常,但是当我尝试将大型多页pdf文件转换为不同大小的图像时,它会消耗非常大量的系统内存(20M pdf文件大约20G物理内存),最终失败了。我将密度设置为 200,因为否则图像质量非常差,我什至无法阅读输出图像中的单词。以下是我的代码:
ImageInfo info = new ImageInfo(inputFilePath);
info.setDensity(200);
MagickImage image = new MagickImage(info);
MagickImage[] imageFrames = image.breakFrames();
for (MagickImage frame : imageFrames) {
ImageInfo frameInfo = new ImageInfo();
MagickImage frameDisplay = frame;
frameDisplay.setFileName(outputFile);
frameDisplay.writeImage(frameInfo);
}
我的java日志中没有错误或异常,我只是看到进程死了。我尝试使用策略.xml在/usr/share/ImageMagick-6.5.4/config/中限制内存使用,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policymap [
<!ELEMENT policymap (policy)+>
<!ELEMENT policy (#PCDATA)>
<!ATTLIST policy domain (delegate|coder|filter|path|resource) #IMPLIED>
<!ATTLIST policy name CDATA #IMPLIED>
<!ATTLIST policy rights CDATA #IMPLIED>
<!ATTLIST policy pattern CDATA #IMPLIED>
<!ATTLIST policy value CDATA #IMPLIED>
]>
<policymap>
<policy domain="resource" name="memory" value="256MB"/>
</policymap>
但不知何故,它似乎不起作用。我正在使用ImageMagick-6.5.4。真的很感谢任何建议!
<policymap>
<policy domain="resource" name="memory" value="256MB"/>
</policymap>
尝试将此部分更新为:
<policymap>
<policy domain="resource" name="memory" value="1000MB"/>
</policymap>
然后重试。 我假设当你说"JVM重新启动"时,你的意思是它崩溃了。 可能是一个OutOfMemory
例外。 没有人可以肯定地说你提供的信息。