如何排查由于对持久化层(MyBatis/Hibernate)一二级缓存管理失控导致的内存不断蚕食

胖敏姑娘_4029

胖敏姑娘_4029

2026-05-25

740人浏览

原创

排查缓存内存泄漏需聚焦缓存对象是否长期滞留无法回收:一级缓存紧盯SqlSession生命周期,避免复用过久;二级缓存检查Key/Value设计与无界配置;用MAT分析强引用锁死对象;慎用@Cacheable避免大对象缓存与序列化问题。

如何排查由于对持久化层(mybatis/hibernate)一二级缓存管理失控导致的内存不断蚕食

排查这类问题,核心是确认缓存对象是否长期滞留、无法被垃圾回收,而不是只看堆内存用了多少。现象通常是:应用不报错、GC能运行、但堆内存曲线缓慢持续上升,尤其在长时运行或定时任务后更明显。

盯住一级缓存的 SqlSession 生命周期

MyBatis 一级缓存默认开启,作用域是单个 SqlSession。若 SqlSession 复用过久(比如被手动管理、未及时 close)、或在长循环/长事务中反复执行相同查询,结果对象就会堆积在 PerpetualCache 的 HashMap 中,无法释放。

  • 检查是否手动调用 sqlSession.close() 或 commit()/rollback() —— 这些操作会清空一级缓存;未执行则缓存一直挂着
  • 避免在 for 循环里复用同一个 SqlSession 执行大量 select,尤其返回大 List 时;应改用批处理或分页 + 新建 SqlSession
  • 不要依赖“自动清空”:update/delete 确实会清一级缓存,但仅限于当前 SqlSession;若没做修改操作,缓存就永远不退场

检查二级缓存的 Key/Value 设计与配置

二级缓存(如 、Caffeine、Ehcache)跨 SqlSession 共享,一旦 Key 冲突或 Value 引用外泄,极易造成内存泄漏。

  • Key 不规范:用 new Object()、含业务字段的复杂对象作 Key,又没重写 equals/hashCode,导致大量重复 Key 实例堆积
  • Value 带隐式引用:缓存 VO/DTO 中持有 Service、Mapper、ThreadLocal、甚至 HttpServletRequest,使整个对象图无法回收
  • 配置无界:如 timeToLiveSeconds=0(永不过期)、maxEntriesLocalHeap 未设上限,数据只进不出

用 MAT 定位强引用锁死的缓存对象

拿到 .hprof 文件后,在 MAT 中聚焦缓存相关类,快速识别异常驻留对象:

  • 打开 Histogram,筛选 org.apache.ibatis.cache、org.springframework.cache、com.github.benmanes.caffeine 等包,看实例数和 Retained Heap 是否异常高
  • 对可疑类右键 → Merge Shortest Paths to GC Roots → 勾选 exclude weak/soft references:这能过滤掉正常缓存项,暴露出被静态 Map、单例 CacheManager 或 ThreadLocal 强引用锁死的对象
  • 查看 Dominator Tree,按 Retained Heap 排序,找排前列但业务上不该长期存在的对象(如某次查出的 50 万条 Entity 列表),再追溯其 GC Roots,大概率指向某个失控缓存

验证 Spring Cache 抽象层是否误用

@Cacheable 是常见泄漏点,尤其在代理机制和返回值设计上容易踩坑:

  • 方法返回大对象(如 List)且未配 unless 或条件淘汰逻辑,缓存体积大、命中率低,还可能因 CGLIB 代理引入残留的 AOP 对象
  • 缓存 Key 使用了未实现 Serializable 的类(尤其在 Redis + Spring Cache 场景下),序列化失败可能导致异常缓存行为
  • @CacheEvict 没配 allEntries = true 或未覆盖关联命名空间,更新操作后旧缓存仍残留
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

302

5

Hibernate框架介绍
Hibernate框架介绍

本专题整合了hibernate框架相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.06

3113

15

Java Hibernate框架
Java Hibernate框架

本专题聚焦 Java 主流 ORM 框架 Hibernate 的学习与应用,系统讲解对象关系映射、实体类与表映射、HQL 查询、事务管理、缓存机制与性能优化。通过电商平台、企业管理系统和博客项目等实战案例,帮助学员掌握 Hibernate 在持久层开发中的核心技能。

2025.09.02

8280

14

Hibernate框架搭建
Hibernate框架搭建

本专题整合了Hibernate框架用法,阅读专题下面的文章了解更多详细内容。

2025.10.14

878

8

mybatis一级缓存和二级缓存
mybatis一级缓存和二级缓存

在MyBatis中,一级缓存和二级缓存是两种不同级别的缓存机制,它们都可以用来提高性能。本专题提供mybatis一级缓存和二级缓存相关文章,大家可以免费阅读。

2023.08.21

583

4

ibatis和mybatis有什么区别
ibatis和mybatis有什么区别

ibatis和mybatis的区别:1、基本信息不同;2、开发时间不同;3、功能与易用性;4、配置文件;5、入参类型与出参类型;6、返回结果集接受方式;7、语法差异;8、数据库方言支持;9、插件支持;10、社区活跃度;11、全球化支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

2922

5

mybatis如何配置数据库连接
mybatis如何配置数据库连接

mybatis配置数据库连接的方法:1、指定数据源;2、配置事务管理器;3、配置类型处理器和映射器;4、使用环境元素;5、配置别名。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

446

5

mybatis工作原理及流程是什么
mybatis工作原理及流程是什么

mybatis工作原理及流程:1、配置文件;2、接口与映射;3、sql解析与生成;4、执行计划;5、结果处理;6、动态sql;7、缓存机制;8、插件;9、事务管理;10、日志与监控;11、扩展性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

292

4

hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

302

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习