Aspose.cad 23.7 使用了自定义字体,导致内存溢出

通过设置自定义字体目录,加载字体
opts.setCustomFontFolders(new String[]{fileProperties.getCustomFontFolder()});
fileProperties.getCustomFontFolder() 是一个文件目录路径,这个目录里面有两个字体,一个字体是11M, 另一个是 27K.
下面是调用代码

    public synchronized File doCadToPdf(InputStream inputStream, String outputFilePath)  throws IOException {

        File outputFile = new File(outputFilePath);
        LoadOptions opts = new LoadOptions();
        opts.setSpecifiedEncoding(CodePages.SimpChinese);
        opts.setCustomFontFolders(new String[]{fileProperties.getCustomFontFolder()});
        CadRasterizationOptions cadRasterizationOptions = new CadRasterizationOptions();
        cadRasterizationOptions.setBackgroundColor(Color.getWhite());
        cadRasterizationOptions.setPageWidth(fileProperties.getNewImageHeight());
        cadRasterizationOptions.setPageHeight(fileProperties.getNewImageWeight() + 105F);
        cadRasterizationOptions.setAutomaticLayoutsScaling(true);
        cadRasterizationOptions.setNoScaling(false);
        cadRasterizationOptions.setDrawType(1);
        PdfOptions pdfOptions = new PdfOptions();
        pdfOptions.setVectorRasterizationOptions(cadRasterizationOptions);
        try (Image cadImage = Image.load(inputStream, opts);
             OutputStream stream = new FileOutputStream(outputFile)) {
            cadImage.save(stream, pdfOptions);
            return outputFile;
        }
    }

案例来说,字体只需要加载一次缓存起来,后面就不用重复加载了,也不会导致内存溢出才对,是我哪里调用错了吗?

下面的图片,是内存溢出后dump文件的分析

企业微信截图_7e324fa3-510e-4634-8844-741c2bacbd46.jpg (136.3 KB)

@huangzx,
你好。
你的代码似乎没问题,但我猜问题可能与字体无关,而与文件有关。请告诉我们你这边的错误是什么,并附上你尝试转换的初始文件。

文件已经找不到当时处理的文件了,因为已经过去有一段时间了,也没有记录每次处理的文件是哪个。当时程序内存溢出,导致停止了。在程序停止前,导出了内存文件。
下面是当时的内存快照

https://tfile.yj2025.com/3a22b5e4-6a5b-455e-86eb-daeba5cdd2a7.zip?attname=3a22b5e4-6a5b-455e-86eb-daeba5cdd2a7.zip

@huangzx,

您可以尝试不同的选项来改进,例如:

opts.setCustomFontFolderOptions(CustomFontFolderOptions.ReplaceFolderForAll);

或者使用单个 LoadOptions 对象加载所有绘图文件。

但无论如何,这些都只是猜测,因为不幸的是,没有文件我们就无法重现问题并找到确切的原因。

ok, 我这边先持续观察一下。 谢谢