问题现象:

一个后台服务在运行一段时间后,观察内存一直在增加,使用MAT工具,打开堆文件分析内存泄漏情况:fileName_Leak_Suspects的index

发现如下提示:

One instance of "org.hibernate.internal.SessionFactoryImpl" loaded by "org.springframework.boot.loader.LaunchedURLClassLoader @ 0x2c00204b8" occupies 8,137,929,888 (98.05%) bytes. The memory is accumulated in one instance of "org.hibernate.internal.util.collections.BoundedConcurrentHashMap$Segment[]" loaded by "org.springframework.boot.loader.LaunchedURLClassLoader @ 0x2c00204b8".

Keywords
org.hibernate.internal.util.collections.BoundedConcurrentHashMap$Segment[]
org.springframework.boot.loader.LaunchedURLClassLoader @ 0x2c00204b8
org.hibernate.internal.SessionFactoryImpl

Details »

打开details,可以看到 org.hibernate.engine.query.spi.QueryPlanCache 占用了大量空间。问题就出在这里。

hibernate中的QueryPlanCache会缓存sql,QueryPlanCache占用多大,基本上归结为IN子句中具有可变数量的值,而Hibernate试图缓存这些查询计划。如果in子句后面跟不同数量或数值,都会增加一条缓存(业务中确实有这么一条根据id进行记录更新操作)。从而缓存大量的sql导致heap内存溢出。

解决方案:

在application.properties文件增加以下配置:

#manages the number of ParameterMetadata instances in the cache (defaults to 128)
spring.jpa.properties.hibernate.query.plan_parameter_metadata_max_size=32#controls the maximum number of entries in the plan cache (defaults to 2048)
spring.jpa.properties.hibernate.query.plan_cache_max_size=64#Sets the maximum number of soft references held in the cache. Set this value to Integer.MAX_VALUE to replicate the behavior of 5.1.1 and earlier. e.g. 2048 (default)
spring.jpa.properties.hibernate.query.plan_cache_max_soft_references=1024#Sets the maximum number of strong references held in the cache. e.g. 128 (default)
spring.jpa.properties.hibernate.query.plan_cache_max_strong_references=64spring.jpa.properties.hibernate.query.in_clause_parameter_padding=true

org.hibernate.engine.query.spi.QueryPlanCache引起内存泄漏问题排查相关推荐

  1. 一次完整的JVM堆外内存泄漏故障排查记录

    前言 记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些JVM内存分配机制以及常用的JVM问题排查指令和工具分享,希望对大家有所帮助. 在整个排查过程中,我也走了不少弯路,但是在文章中我 ...

  2. Java内存泄漏的排查

    1.内存溢出 一种通俗的说法. 1.内存溢出:你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数据,出现溢出. 2.内存泄漏:你用new申请了一块内存,后来很长时间都不再使用了(按理应该 ...

  3. python 内存泄漏的排查

    python 内存泄漏的排查 判断该次上线或发版的内容,排查到具体上线了那些接口或修改了那些接口 单起一个服务,使用ps -aux |grep pid 查看该进程占用的内存大小 work@xxx:~$ ...

  4. java 内存泄露对象排查_记录一次 java内存泄漏的排查

    1.问题:jar进程会随着时间由 30% 上涨到 70% 直到虚机报警.重启过后,还是会缓慢上涨: 进程数也在上涨: 2.在排查内存问题时,可能会使用的命令 1)查看 java 进程:jps -l 可 ...

  5. 一次 Java 内存泄漏的排查

    由来 前些日子小组内安排值班,轮流看顾我们的服务,主要做一些报警邮件处理.Bug 排查.运营 issue 处理的事.工作日还好,无论干什么都要上班的,若是轮到周末,那这一天算是毁了. 不知道是公司网络 ...

  6. 【错误记录】Android 内存泄漏 错误排查记录 ( FinalizerReference 内存泄漏 )

    文章目录 一. 报错信息 二. 内存排查 三. 代码分析及修改 四. 不同版本说明 参考以下博客 : [Android 内存优化]Android Profiler 工具常用功能 ( 监测内存 | 内存 ...

  7. jstat 内存泄漏_一次Java内存泄漏的排查!要了自己的老命!

    点击上方"Java之间",选择"置顶或者星标" 你关注的就是我关心的! 作者:枕边书 来源:https://zhenbianshu.github.io 一.由来 ...

  8. 分享一次 Java 内存泄漏的排查

    由来 前些日子小组内安排值班,轮流看顾我们的服务,主要做一些报警邮件处理.Bug 排查.运营 issue 处理的事.工作日还好,无论干什么都要上班的,若是轮到周末,那这一天算是毁了. 不知道是公司网络 ...

  9. Kaldi内存泄漏问题排查

    转载自:https://www.baidu.com/link?url=uUnBEi2XoXwkMYf_mLzKuZmdz8auQ5mjvwYE0c5zsKS2kUcEMv3fo9wUmva2S84mX ...

最新文章

  1. 《监控》再起风云,连同创作中的《监控2》成功牵手影视公司
  2. CVPR2020中关于3D点云分割
  3. R语言绘制韦恩(venn)图
  4. 负载均衡探测器lbd
  5. 自定义注解-aop实现日志记录
  6. Boost:ping的测试程序
  7. WebBrowser内核指定
  8. mysql挂载数据卷_记一次生产数据库数据文件进行分区转移
  9. 最佳论文!牛津大学揭示梯度下降复杂度理论
  10. 数仓搬迁:从方法到实践,带你解决数据一致性对比
  11. “碰瓷”特斯拉翻船,卡车界明星创企Nikola身陷“骗局”危机
  12. PAIP.ASP重复INCLUDE包含引起的重定义错误解决方案
  13. 增长量计算n+1原则_资料分析听课笔记
  14. 第三课 protel学习系列——protel功能拓展
  15. 放入http请求头中的内容如果含有中文必须编码
  16. html给一个样式最高权重,什么是CSS权重?
  17. 漫谈TCP-AIMD/BBR的公平性以及buffer bloat
  18. 花花公子跟风删除Facebook主页,区块链技术可打破互联网垄断
  19. 意图推荐 Metapath-guided Heterogeneous Graph Neural Network for Intent Recommendation
  20. Python迷宫游戏

热门文章

  1. 计算机技术个别化教学,现代教育技术在个别化教育教学的作用
  2. oracle数据日期格式,Oracle常用日期数据格式
  3. python - 用struct以及HxD查看浮点数在内存中的存储,默认是双精度浮点数
  4. 操作系统实验11:内存管理实验(DAY 62)
  5. 《点融支付系统架构的演进》阅读有感
  6. JS实现表格搜索内容
  7. 内容广告联盟,劣币是怎么驱逐良币的。
  8. 全日制和非全日制之争,看完六年前的这个文件心里就有数了
  9. 优秀的装机必备「系统「效率「笔记「程序员」mac软件集
  10. atthesametime啥意思_aroundthesametime和atthesametime的区别是什么