mysql导致的内存泄漏Abandoned connection cleanup thread

今天突然收到了报警,说内存占用超过了95%,赶紧到服务器看下

top一下,发现SpringBoot占用内存过大

jmap看一下是什么占用了内存

bash 复制代码
ps -ef | grep java
jmap -histo:live 31021 | head -30

排名前3占用特别大,第一个是C,表示char\[数组,第二个Constructor是用来构造反射的,第三个Class是加载的元数据,大概意思是通过反射大量创建了对象。

奇怪了, java不是有垃圾回收机制吗,为什么还会创建这么多对象,带着疑问先dump下来再说

bash 复制代码
jmap -dump:live,format=b,file=heap_31021.hprof 31021

拿到dump文件,之后需要通过EclipseMAT内存分析工具打开,下载地址:Eclipse MAT

安装完Exclipse MAT后,打开文件,选择刚刚dump的heap_31021.hprof文件

不要着急,需要等待一两分钟,如果显示这个,直接finish即可

进入之后,可以看到有个泄漏疑点的页签

如果没有,在首页也可以进入

看到了3个疑点

划线部分的Abandoned connection cleanup thread 是MySQL的一个清理线程,用来清理残留的连接,LaunchedURLClassLoader是SpringBoot的类加载器

大概意思就是MySQL的清理线程一直吊着ClassLoader,导致大量通过ClassLoader创建之后的类和对象无法回收

说人话,就是你代码里用到的反射,基本都要用ClassLoader创建,而MySQL一直吊着ClassLoader,导致GC回收的时候,发现CladdLoader还被引用着,所以通过ClassLoader加载的类和对象,无法被回收和释放

进一步观察,我们去找找MySQL源码,直接搜AbandonedConnectionCleanupThread,如图所示,有没有觉得这串英文很熟悉

MySQL启动了个线程在后台跑

而且还通过静态代码块启动,不归Spring管理,就会导致线程一直无法正常关闭,ClassLoader一直被引用

但这并不是直接内存溢出的原因,一般是由这几个原因并发构成的:

1.用的mysql驱动包是5.x版本

2.项目里大量用到反射

3.项目并发高,并且持续运行了一段时间

解决方式

Spring关闭的时候,销毁一下MySQL的清理线程

java 复制代码
@Component
public class MysqlCleanup {
    @PreDestroy
    public void shutdown() throws Exception {
        AbandonedConnectionCleanupThread.checkedShutdown();
    }
}

升级MySQL驱动版本到8.x

XML 复制代码
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.0.33</version>
</dependency>

8.x版本驱动完美兼容mysql5.x版本的mysql,所以不用担心,只需要连接信息做一点小改造就好

driver-class-name原本是com.mysql.jdbc.Driver,改成com.mysql.cj.jdbc.Driver

8.x版本有时区问题,url连接参数加一个&serverTimezone=Asia/Shanghai就好了

相关推荐
小白男神3 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
这个DBA有点耶3 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G3 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备3 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远3 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
kybs19913 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
2601_962218613 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
程序猿_极客3 天前
【免费】分享一套优质的基于SSM的校园失物招领系统的设计与实现,源码+文档+视频详解(讲解)
java·mysql·ssm·课程设计·失物招领系统
张洛闻Eren3 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安3 天前
MySQL-触发器
数据库·mysql