Hibernate QueryPlanCache引发的JVM内存泄漏
一、生产环境问题现象
一个经手多人的项目,项目中用到了hibernate作为ORM框架。生产环境中会出现HeapUsage持续缓慢上升的情况,导致触发HeapUsage超过80%的告警(见图1)。
二、问题分析
生产环境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)。