使用aspose words java出现堆外内存泄露

  • 背景
    生产环境应用出现堆外内存泄漏的问题

堆内配置32G + 直接堆外 2G + FineIO读写 3G = 37G

实际不管是top还是pmap里看,应用总内存达到了51G,堆外占了17G,因此可以确定是堆外内存泄漏

  • 排查过程
    dump出来了内存块,一次打1G,全转化为txt给到我们这边,打开看,里面有大量的com.aspose.word.XXX相关对象名,以及后面跟着的一大堆符号


    网上搜了一些资料,发现aspose的各类组件库(不仅仅是word)都被报告过内存泄漏问题

https://forum.aspose.com/tag/memoryleak

因此怀疑是word插件使用到此组件库导致的

  • 诉求
    想确认aspose words for java是否在新版本修复了堆外内存泄露相关的问题。目前我们应用使用的版本是aspose-words-22.4-jdk17.jar

@bigdamage

我已了解您在生产环境中使用 Aspose.Words for Java 22.4‑jdk17.jar 时出现了离堆(off‑heap)内存持续增长的情况,并且在内存 dump 中看到大量 com.aspose.word.* 对象的残留,怀疑是组件本身的内存泄漏。

已知的类似报告与修复情况

  • Aspose.Words for Java 23.1 版本中,执行 Word → HTML 转换时也被报告出现了内存泄漏【2】。
  • 同一类泄漏在使用 Aspose.Words for Java 11.8.0(当时的最新版本)后已被确认修复【3】。
  • 更早的 Aspose.Words for Java 1.0.3 也曾修复过类似的内存泄漏问题【5】。

这些记录表明,Aspose.Words 在后续版本中已经针对离堆内存泄漏做过修复。虽然没有直接的公开记录说明 22.4 版是否仍保留该问题,但从上述信息可以推断 升级到更高的版本(建议使用当前最新的 23.x 系列) 有较大概率解决您遇到的泄漏。

推荐的下一步操作

  1. 升级到最新的 Aspose.Words for Java(如 23.1 或更高),并在相同的业务场景下复现问题。
  2. 在升级后使用 -Xlog:gc+heap=info(或等效的 JVM 参数)监控离堆内存变化,确认是否仍有异常增长。
  3. 若仍出现泄漏,请提供:
    • 最小可复现的代码片段(包括文档加载、处理、保存的完整流程)。
    • 运行环境信息(JDK 版本、操作系统、是否使用 FineIO 等 I/O 加速库)。
    • 具体的堆外内存占用快照(如 jcmd <pid> VM.native_memory summary 输出)。

有了上述最小示例和环境细节,我们可以进一步定位是 Aspose.Words 本身的缺陷,还是使用方式(如未及时释放 DocumentNodeImage 等资源)导致的泄漏。

小提示

  • 对于可能产生大量临时本地缓冲区的操作(如图片提取、文档转换),建议使用 try‑with‑resources 或显式调用 dispose()(如 Document.dispose())来强制释放本地内存。
  • 若项目中使用了 FineIO,请确认其缓冲区大小与 Aspose.Words 的内部缓冲区没有冲突,必要时可以调小 FineIO 的直接内存阈值。

请您先尝试升级并提供上述信息,以便我们进一步确认并协助定位根本原因。祝您调试顺利!

@bigdamage 由于该Java版本是从.NET移植而来,根据文档内容的不同,可能会存在内存泄漏问题。我们正基于提供的文件持续修复这些内存泄漏问题。请使用最新版Aspose.Words for Java版本检查内存泄漏情况,若问题仍存在,请提供出现该问题的文件。