Hibernate QueryPlanCache引发的JVM内存泄漏

Hibernate QueryPlanCache引发的JVM内存泄漏

一、生产环境问题现象

一个经手多人的项目,项目中用到了hibernate作为ORM框架。生产环境中会出现HeapUsage持续缓慢上升的情况,导致触发HeapUsage超过80%的告警(见图1)。
图1. JVM Heap Usage监控

二、问题分析

生产环境dump内存快照(jmap -dump:live,format=b,file=/tmp/dump.hprof $pid)。通过MAT工具进行分析,发现char[]类型数据占比达61.1%(见图2)。List objects char[]类型数据,发现存在很多SQL字符串(见图3),对基本相同的两条SQL字符串进行文字对比,发现只有参数不同(见图4);同时SQL字符串被Hibernate的queryPlanCache持有(见图5)。

至此,可以判断是SQL缓存导致的问题。Google后发现应该是代码中拼接的SQL每次执行时参数不同导致Hibernate重复缓存SQL。全文检索代码,确实找到了问题(见图7)。

图2. MAT Histogram

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值