Hibernate QueryPlanCache 查询计划缓存引发的内存溢出

news2024/12/27 13:03:25

目录

    • 1.排查方式
    • 2.结论
    • 3.解决办法

前言:在生产环境中有一个后端程序多次报oom然后导致程序中断。

1.排查方式

通过下载后端程序产生的oom文件,将oom文件导入MemoryAnalyzer程序分析程序堆内存使用情况。


1、将oom文件导入MemoryAnalyzer后可以看到概览信息界面。总共堆空间是5.6G,【org.hibernate.internal.SessionFactoryImpl @ 0x6c9877ab8】 这个对象占用 128 B 回收后可释放 4.8 GB,接下来看一下这个里面有哪些对象
在这里插入图片描述

2、第二步我们点开泄漏疑点看下分析报告
在这里插入图片描述

3、通过分析报告看到 org.hibernate.internal.SessionFactoryImpl 这个对象引用占用了总内存的 85.53%,总共引用大小是 5,116,381,640 字节,也就是 4.8G的大小。可以看到他引用了 QueryPlanCache 这个对象。

在这里插入图片描述


4、点开左上角第二个图标对象创建直方图,这里可以看到每个类有多少个实例,以及占用的内存。

可以看到这个char占用了很多内存,可以右键 List objects → with incoming references,就可以列出所有的char[]实例,以及每个char[]的整个引用关系链

在这里插入图片描述

通过关系链可以看到char实例都是存储的一些sql语句,点开第一个发现最后被HQLQueryPlan查询计划类引用了

在这里插入图片描述

5、点开左上角第三个图标打开整个堆的支配树,可以看到第一个实例占比达到了 85.53%。

在这里插入图片描述
我们点开这个占比 85.53% 的对象发现都是被 org.hibernate.internal.util.collections.BoundedConcurrentHashMap 这个对象引用了。

往下继续点开发现基本都是查询语句,发现每个查询语句都是一样的,就是后面in的参数不同,继续点开其他的发现都是这个语句

select count(generatedAlias0) from BizReportCatalogAttach as generatedAlias0 where generatedAlias0.bizTableFillId in (:param0_0, :param0_1, :param0_2, .... , :param0_68)

在这里插入图片描述

点开这个sql语句的参数发现 in 里面有3万多个参数,其他的SQL语句都是一样,就是 in 的参数不一样所以被缓存起来了

在这里插入图片描述


2.结论

至此,可以判断是被 Hibernate QueryPlanCache 查询计划JPQL缓存导致的问题。里面的SQL每次执行时随着in的参数不同导致Hibernate重复缓存SQL

hibernate会缓存sql语句以减少重复编译,便于直接命中提高效率。这个缓存默认QueryPlanCache的map entry默认容量上限是2048,且在使用in时,只要in后面的参数有任何一个不一样的,就会视为不同的语句而保存下来。


3.解决办法

通过配置Hibernate缓存sql语句的最大个数配置来限制缓存个数

在application.properties中添加如下配置

#指定Hibernate查询计划缓存sql语句的最大个数, 默认2048, 详见org.hibernate.engine.query.spi.QueryPlanCache
spring.jpa.properties.hibernate.query.plan_cache_max_size=64
#指定Hibernate查询计划参数元数据缓存的最大大小, 管理缓存中ParameterMetadata实例的数量(默认为128), 详见org.hibernate.engine.query.spi.QueryPlanCache
spring.jpa.properties.hibernate.query.plan_parameter_metadata_max_size=32

如果hibernate 5.2.17+时,还可以添加此配置以减少IN子句的SQL计划缓存。
参考文档:https://docs.jboss.org/hibernate/orm/5.6/userguide/html_single/Hibernate_User_Guide.html

#Hibernate可以根据参数格式的几何算法进行生成缓存,例如生成2个参数、4个参数、2^2个参数的SQL,从而优化IN子句的使用,减少不必要的SQL计划缓存,避免因大量使用IN查询而导致内存溢出的问题‌
spring.jpa.properties.hibernate.query.in_clause_parameter_padding=true

添加配置后通过debug启动可以在这里打断点看下我们的配置是否生效,我们在这里能看到上面很熟悉的三个身影:SessionFactoryImplementor、QueryPlanCache、BoundedConcurrentHashMap 这三个类,SessionFactoryImplementor 的引用占用了85.53%的堆空间

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2124120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在银河麒麟服务器操作系统中设置SSH登录限制

在银河麒麟服务器操作系统中设置SSH登录限制 1、引言2、 步骤一:检查MaxStartups选项3、步骤二:修改MaxStartups选项4、步骤三:重启SSH服务 💖The Begin💖点点关注,收藏不迷路💖 1、引言 在服务…

flask旧衣物捐赠系统—计算机毕业设计源码26577

摘要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作规…

【干货分享】Ftrans安全数据交换系统 搭建跨网数据传输通道

安全数据交换系统是一种专门设计用于在不同的网络、系统或组织之间安全地传输数据的软件或硬件解决方案。这种系统通常包含多种安全特性,以确保数据在传输过程中的保密性、完整性和可用性。 安全数据交换系统可以解决哪些问题? 安全数据交换系统主要解…

神经网络卷积层和最大池化

文章目录 一、卷积层原理二、相关函数的概念三、卷积层的应用四、最大池化原理五、最大池化案例 一、卷积层原理 ./ 当前目录;…/ 上级目录 父类(也称为基类或超类)是指在类继承体系中被其他类继承的类。也就是被其他子类进行调用的类 当In_…

「豆包 Marscode 体验官」AI 加持的云端 IDE——三种方法高效开发前后端聊天交互功能

以下是「豆包 MarsCode 体验官」优秀文章,作者努力的小雨。 豆包 MarsCode 豆包MarsCode 编程助手支持的 IDE: 支持 Visual Studio Code 1.67.0 及以上版本,以及 JetBrains 系列 IDE,如 IntelliJ IDEA、Pycharm 等,版本要求为 22…

016.PL-SQL编程—过程

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

服务器测试之GPU基础汇总

GPU基础汇总 1.GPU简介 1.1.什么是GPU GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”。一个专门的图形核心处理器。GPU是显示卡的“大脑”,决定了该显卡的档次和大部分性能,同时也是2D显示卡和3D显示卡的区别依据。可以形…

Flask 第三课 -- 第一个应用

上一章节我们已经成功安装了 Flask,接下来我们可以创建一个简单的 Flask 应用。 首先,创建一个名为 app.py 的文件,并添加以下内容: from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello,…

网络拓扑结构介绍

这张图展示了一个复杂的网络拓扑结构,它包括了多个运营商的接入、负载均衡、安全防护以及数据处理等多个关键环节。整个网络通过精心设计的架构和高效的节点连接,实现了数据的快速传输和安全处理。 一、各个模块介绍 运营商接入: 移动、电信…

论文速读|形机器人的高速和抗冲击远程操作

论文地址:https://arxiv.org/pdf/2409.04639 本文提出了一种综合解决方案,用于远程控制类人机器人,实现了高速度和冲击抵抗的操作。通过结合无校准的运动捕捉和重定标、低延迟全身运动流式传输工具箱和高带宽的摆线驱动器,显著提高…

【Python报错已解决】ValueError: All arrays must be of the same length

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:调整数组长度2.2 步骤二…

数据流图的例题2

答案选B 解析: 第一个错误,E1和E2是外部实体,实体之间不可能有数据传输,DF2错误 第二个错误,DF6是外部实体把数据传到存储。外部实体必须把数据传到加工,进行加工之后才能对数据存储,DF6错误…

Git环境搭建

我的博客大纲 我的GIT学习大纲 Git安装步骤: 1.官网地址 查看 GNU 协议,可以直接点击下一步: 2.Git配置选项如下: 3.选择后台客户端连接协议,选默认值 OpenSSL,然后下一步。 4.Git换行符号 5.选择终端类型…

Lesson08---string类(2)

1.assign assign的功能就类似于把string里面原来有的东西清空然后重新赋值 但是重新赋值也可以达到一样的效果感觉没什么用,了解一下就行 2.insert 第一个参数是在第几个位置插入,第二个参数是插入的字符串 但是这里不得不吐槽一下这里只能是字符串&…

Python之异常处理与程序调试(Exception Handling and Program Debugging in Python)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Netty权威指南:Netty总结-服务端创建

第13章 服务端创建 13.1 原生NIO类库复杂性 开发高质量的NIO的程序并不简单,成本太高 13.2 服务端创建源码 通过ServerBootStrap启动辅助类启动Netty 13.2.1 创建时序图 以下是关键步骤: 创建ServerBootStrap实例。这是启动辅助类,提供一…

AI写作培训课创业参考模式:《如何与AI共同写作》

在数字化时代,写作能力已成为职场和生活中不可或缺的一项技能。随着人工智能技术的发展,AI工具开始在写作过程中发挥越来越重要的作用。《如何与AI共同写作》正是这样一门专业的在线写作课程,它通过结合AI技术和实践操作,帮助学员在30天内掌握高效的写作技巧,提升个人品牌…

网络安全-原型链污染

目录 一、简单介绍一下原型链 二、举个例子 三、那原型链污染是什么呢 四、我们来看一道题-hackit 2018 4.1 环境 4.2开始解题 4.3 解答: 一、简单介绍一下原型链 JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象拥有一个原…

MySQL基础——DQL

DQL(Data Query Language,数据查询语言)是SQL中的一个子集,主要用于查询数据库中的数据。DQL的核心语句是 SELECT,它用于从一个或多个表中提取数据,并能够通过各种条件进行过滤、排序和聚合操作。下面是DQL…

Android解析XML格式数据

文章目录 Android解析XML格式数据搭建Web服务器Pull解析方式SAX解析方式 Android解析XML格式数据 通常情况下,每个需要访问网络的应用程序都会有一个自己的服务器,我们可以向服务器提交数据,也可以从服务器上获取数据。不过这个时候就出现了…