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%
- 关联67230个
- 关联67230个
- 关联67231个
- 包含67231个
- 其内部持有的1个
问题根因
该问题为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
相关产品推荐
相关产品推荐

