[转帖]hibernate QueryPlanCache引发的heap区内存溢出

hibernate,queryplancache,引发,heap,内存,溢出 · 浏览次数 : 0

小编点评

**问题:** 使用Hibernate作为数据持久层时,在并发测试中发现内存溢出问题,利用JvisualVM工具对heap dump进行分析发现 sessionFactoryImpl中的QueryPlanCache体积特别庞大,分析结果表明可能是缓存查询计划导致内存溢出。 **解决方案:** 1. 使用MAT对heap dump文件进行分析,找到异常对象的堆栈信息。 2. 发现 sessionFactoryImpl中的QueryPlanCache体积特别庞大,分析结果表明可能是缓存查询计划导致内存溢出。 3. 通过分析堆栈信息,找到异常对象的类型,发现是`SessionFactoryImpl`。 4. 结合问题分析结果,定位问题的根源:`SessionFactoryImpl`中的QueryPlanCache可能因为缓存大量sql导致内存溢出。 5. 通过采用站位符的方式,解决问题,避免每个paramter string都不同,使hibernate认为这是相同的hql并进行大量缓存。 6. 测试结果保持稳定状态,问题解决。

正文

https://blog.csdn.net/dream_lixiang/article/details/77248292

   这个问题是很久之前解决的问题,今天在整理电脑资料的时候,发现了当时解决问题的一些截图,在此发记录一下,以免自己忘记。

   有一个项目中用到了hibernate作为数据持久层,当项目完成,使用loadrunner进行并发测试的时候,当测试跑了几天,就因为内存溢出挂掉了。当对奔溃场景进行重现的时,利用了JvisualVM工具对其进行监控,发现了其heap区内存一直在持续增长,利用heap dump分析其内存情况,发现有几种类型的对象增长异常。当时针对监控的问题还给领导发了一封邮件,信息如下:

houadang

通过下图可以看到,heap区的变化就相当明显:


  但是增长异常的对象类型像ConcurrentHashMap$HashEntry、char[]、Object我根本没有直接用到,程序中的String也不存在内存泄漏的问题,这让我很头疼。于是使用了MAT对heap dump文件进行分析,找到了异常对象的堆栈


SessionFactoryImpl是我程序中直接依赖的,我看到了SessionFactoryImpl中的QueryPlanCache的体积特别庞大,此次的内存溢出问题的罪魁祸首就是它。通过它的名字,就可以知道它是用来缓存查询计划的,也就是缓存sql语句,但是为什么会这么大喃?后来我在外网上发现有网友出现同样的问题(

http://stackoverflow.com/questions/31557076/spring-hibernate-query-plan-cache-memory-usage),他的原因是因为in子句,

Using Hibernate 4.2 and MySQL in a project with an in-clause query such as: select t from Thing t where t.id in (?)

Hibernate caches these parsed HQL queries. Specifically the Hibernate SessionFactoryImpl has QueryPlanCache with queryPlanCache and parameterMetadataCache. But this proved to be a problem when the number of parameters for the in-clause is large and varies.

These caches grow for every distinct query. So this query with 6000 parameters is not the same as 6001.

The in-clause query is expanded to the number of parameters in the collection. Metadata is included in the query plan for each parameter in the query, including a generated name like x10_, x11_ , etc.

Imagine 4000 different variations in the number of in-clause parameter counts, each of these with an average of 4000 parameters. The query metadata for each parameter quickly adds up in memory, filling up the heap, since it can't be garbage collected.

This continues until all different variations in the query parameter count is cached or the JVM runs out of heap memory and starts throwing java.lang.OutOfMemoryError: Java heap space.

大概的意思就是,QueryPlanCache会缓存sql,以便于后边的相同的sql重复编译,如果in后的参数不同,hibernate会把其当成不同的sql进行缓存,从而缓存大量的sql导致heap内存溢出。我的程序中没有使用in,但通过查看程序,我发现我的一条hql中同时采用paramter string拼接和占位符两种方式,这样会不会因为每一个paramter string都不同,hibernate认为这是不同的hql从而进行大量缓存喃?于是我全部采用站位符的方式,再进行测试,发现程序heap内存一直处于稳定状态,问题解决。

与[转帖]hibernate QueryPlanCache引发的heap区内存溢出相似的内容:

[转帖]hibernate QueryPlanCache引发的heap区内存溢出

https://blog.csdn.net/dream_lixiang/article/details/77248292 这个问题是很久之前解决的问题,今天在整理电脑资料的时候,发现了当时解决问题的一些截图,在此发记录一下,以免自己忘记。 有一个项目中用到了hibernate作为数据持久层,当项目完

[转帖]Hibernate的QueryPlanCache引发的堆内存溢出

事情缘由 协助公司中药网排查内存溢出的问题。这个系统是基于Hibernate3开发的一个药品信息、价格变动、药品咨询新闻相关的网站,90%的操作都是查询。 问题日志 工具排查 Dump堆内存文件,使用MAT进行分析 1、jsp 命令获取应用的pid 2、jmap -dump:format=b,fil

[转帖]org.hibernate.engine.query.spi.QueryPlanCache引起内存泄漏问题排查

事情缘由 协助公司中药网排查内存溢出的问题。这个系统是基于Hibernate3开发的一个药品信息、价格变动、药品咨询新闻相关的网站,90%的操作都是查询。 问题日志 工具排查 Dump堆内存文件,使用MAT进行分析 1、jsp 命令获取应用的pid 2、jmap -dump:format=b,fil

[转帖]org.hibernate.engine.query.spi.QueryPlanCache引起内存泄漏问题排查

问题现象: 一个后台服务在运行一段时间后,观察内存一直在增加,使用MAT工具,打开堆文件分析内存泄漏情况:fileName_Leak_Suspects的index 发现如下提示: One instance of "org.hibernate.internal.SessionFactoryImpl" 

[转帖]

Linux ubuntu20.04 网络配置(图文教程) 因为我是刚装好的最小系统,所以很多东西都没有,在开始配置之前需要做下准备 环境准备 系统:ubuntu20.04网卡:双网卡 网卡一:供连接互联网使用网卡二:供连接内网使用(看情况,如果一张网卡足够,没必要做第二张网卡) 工具: net-to

[转帖]

https://cloud.tencent.com/developer/article/2168105?areaSource=104001.13&traceId=zcVNsKTUApF9rNJSkcCbB 前言 Redis作为高性能的内存数据库,在大数据量的情况下也会遇到性能瓶颈,日常开发中只有时刻

[转帖]ISV 、OSV、 SIG 概念

ISV 、OSV、 SIG 概念 2022-10-14 12:29530原创大杂烩 本文链接:https://www.cndba.cn/dave/article/108699 1. ISV: Independent Software Vendors “独立软件开发商”,特指专门从事软件的开发、生产、

[转帖]Redis 7 参数 修改 说明

2022-06-16 14:491800原创Redis 本文链接:https://www.cndba.cn/dave/article/108066 在之前的博客我们介绍了Redis 7 的安装和配置,如下: Linux 7.8 平台 Redis 7 安装并配置开机自启动 操作手册https://ww

[转帖]HTTPS中间人攻击原理

https://www.zhihu.com/people/bei-ji-85/posts 背景 前一段时间,公司北京地区上线了一个HTTPS防火墙,用来监听HTTPS流量。防火墙上线之前,邮件通知给管理层,我从我老大那里听说这个事情的时候,说这个有风险,然后意外地发现,很多人原来都不知道HTTPS防

[转帖]关于字节序(大小端)的一点想法

https://www.zhihu.com/people/bei-ji-85/posts 今天在一个技术群里有人问起来了,当时有一些讨论(不完全都是我个人的观点),整理一下: 为什么网络字节序(多数情况下)是大端? 早年设备的缓存很小,先接收高字节能快速的判断报文信息:包长度(需要准备多大缓存)、地