You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Alfresco Process Service调用tasks/query接口触发内存泄漏问题

Alfresco Process Service任务查询接口触发内存泄漏问题排查

问题现象

  • 服务运行期间JVM内存占用持续攀升,直至触达-Xmx设定的内存上限,故障时段CPU使用率普遍低于10%
  • 调用/activiti-app/api/enterprise/tasks/query接口时,内存上涨速度明显加快

环境与配置信息

JVM启动参数

-Xms8g -Xmx16g

触发故障的接口请求

  • 接口路径:/activiti-app/api/enterprise/tasks/query
  • 请求体:
{
    "appDefinitionId": null,
    "sort": "created-desc",
    "size": 50,
    "start": 0,
    "text": "",
    "state": "completed"
}

Hibernate相关依赖版本

  • hibernate-commons-annotations-4.0.2.Final
  • hibernate-core-4.2.16.Final
  • hibernate-entitymanager-4.2.16.Final
  • hibernate-jpa-2.0-api-1.0.1.Final(重复引入2次)
  • hibernate-validator-5.3.6.Final

堆转储分析结论

堆内存占用Top1的对象链路如下:

  • 1个org.hibernate.engine.internal.StatefulPersistenceContext实例,保留大小10.660MB,占分析样本的97%
    • 其内部持有的1个org.hibernate.engine.internal.EntityEntryContext实例占10.656MB,占比100%
      • 包含67231个org.hibernate.engine.internal.EntityEntryContext$ManagedEntityImpl实例,占10.655MB,占比99.9%
        • 关联67231个org.hibernate.engine.spi.EntityEntry实例,占10.653MB,占比99.9%
          • 关联67230个java.lang.Object[]实例,占10.648MB,占比99.9%
            • 关联67230个byte[]实例,占10.609MB,占比99.5%

问题根因

该问题为Alfresco Process Service搭配Hibernate 4.2.x版本的典型一级缓存泄漏问题:查询已完成任务列表时,Hibernate Session级别的持久化上下文(即堆转储中占比最高的StatefulPersistenceContext)未及时释放,查询过程中加载的任务实体、流程变量二进制内容持续驻留内存,无法被垃圾回收。当前环境重复引入2次hibernate-jpa-2.0-api-1.0.1.Final依赖,会进一步加剧内存占用异常。

修复方案

  • 调整查询事务粒度:为任务查询接口配置独立短事务,事务提交后Session自动销毁,一级缓存随Session回收,避免长事务场景下缓存持续累积
  • 手动清理一级缓存:如果使用长事务承载查询逻辑,每批次分页查询完成后手动执行entityManager.flush(); entityManager.clear();,清空持久化上下文中的托管实体,释放关联内存
  • 优化查询字段映射:查询已完成任务列表时,默认仅加载列表展示必需的字段,禁止一次性全量加载关联的流程变量二进制内容(对应堆转储中占比最高的byte[]对象),流程变量改为按需单独查询
  • 修复依赖冲突:排查构建配置,移除重复引入的hibernate-jpa-2.0-api依赖,避免同版本类重复加载带来的额外内存开销

内容的提问来源于stack exchange,提问作者Ayslan Ferreira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:09:21