当前位置: 首页 > news >正文

Druid监控sql导致的内存溢出--内存分析工具MemoryAnalyzer(mat)

问题

druid监控sql在网页端显示,我的服务插入sql比较大,druid把执行过的sql保存在DruidDataSource类的成员变量JdbcDataSourceStat dataSourceStat;
JdbcDataSourceStat类中的LinkedHashMap<String, JdbcSqlStat>  sqlStatMap中; sqlStatMap中的sql越来越多导致老年区的内存越来越多且回收不掉。

解决办法

关闭druid的监控,该监控会耗尽内存 

spring.datasource.druid.stat-view-servlet.enabled=false 
spring.datasource.druid.web-stat-filter.enabled=false # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
#        filters: stat,wall,slf4j    原来的配置filters: slf4j     #现在的配置,除去stat,wall

发现问题

2025-04-27T02:04:58.124+0800: 118542.443: [Full GC (Ergonomics) [PSYoungGen: 389120K->389119K(427520K)] [ParOldGen: 1747632K->1747631K(1747968K)] 2136752K->2136751K(2175488K), [Metaspace: 91767K->91767K(1136640K)], 0.4695953 secs] [Times: user=1.64 sys=0.00, real=0.47 secs] 
2025-04-27T02:04:58.593+0800: 118542.914: [Full GC (Ergonomics) [PSYoungGen: 389120K->389119K(427520K)] [ParOldGen: 1747631K->1747631K(1747968K)] 2136751K->2136751K(2175488K), [Metaspace: 91767K->91767K(1136640K)], 0.4865868 secs] [Times: user=1.48 sys=0.02, real=0.49 secs] 
2025-04-27T02:04:59.082+0800: 118543.402: [Full GC (Ergonomics) [PSYoungGen: 389119K->389119K(427520K)] [ParOldGen: 1747635K->1747629K(1747968K)] 2136755K->2136749K(2175488K), [Metaspace: 91767K->91767K(1136640K)], 0.4742007 secs] [Times: user=1.52 sys=0.00, real=0.47 secs] 
2025-04-27T02:04:59.557+0800: 118543.877: [Full GC (Ergonomics) [PSYoungGen: 389120K->389119K(427520K)] [ParOldGen: 1747629K->1747629K(1747968K)] 2136749K->2136749K(2175488K), [Metaspace: 91767K->91767K(1136640K)], 0.4986030 secs] [Times: user=1.55 sys=0.02, real=0.50 secs] 
2025-04-27T02:05:00.057+0800: 118544.377: [Full GC (Ergonomics) [PSYoungGen: 389120K->389119K(427520K)] [ParOldGen: 1747629K->1747629K(1747968K)] 2136749K->2136749K(2175488K), [Metaspace: 91767K->91767K(1136640K)], 0.4815433 secs] [Times: user=1.63 sys=0.00, real=0.48 secs] 
2025-04-27T02:05:00.539+0800: 118544.859: [Full GC (Ergonomics) [PSYoungGen: 389119K->389119K(427520K)] [ParOldGen: 1747629K->1747629K(1747968K)] 2136749K->2136749K(2175488K), [Metaspace: 91767K->91767K(1136640K)], 0.4686810 secs] [Times: user=1.53 sys=0.00, real=0.47 secs] 

这个GC日志显示Full GC没有释放任何堆内存空间,还一直在执行Full GC,导致cpu占用在80%,可能是存在内存泄漏问题导致对象无法被回收。

找出问题根源

1.导出dump文件

方式一: jmap -dump:format=b,file=D:\work_temp\1\shdhv3.hprof 20920

20920=pid

方式二:运行C:\Program Files\Java\jdk1.8.0_171\bin\jvisualvm.exe

选中运行的jar应用程序--》堆Dump(H) -->在下面生成heapdump文件--》右键--》另存为--》选择路径

2.下载安装mat

MemoryAnalyzer工具是Eclipse内存分析器是一种快速、功能丰富的java堆分析器,可以帮助你找到内存泄漏和减少内存消耗,比jdk自带的工具强大很多。

下载地址:

https://eclipse.dev/mat/

mat需要至少jdk17版本,我的只有jdk1.8,下载jdk17安装后把jdk-17的文件夹直接拷贝到MemoryAnalyzer-1.16.1.20250109-win32.win32.x86_64\mat路径下

指定jdk17路径,修改MemoryAnalyzer.ini文件,在文件内容的最前面添加指定

-vm
D:\常用软件\MemoryAnalyzer-1.16.1.20250109-win32.win32.x86_64\mat\jdk-17\bin\javaw.exe

3.使用mat分析dump文件

运行MemoryAnalyzer.exe---》file--》open heap dump--》选择生成的dump文件--》leak suspects report--》finish

打开Overview界面--》Dominator Tree,如下图:

跳转到Dominator Tree界面,所有类的占用内存排序显示出来了,哪些类占用内存一目了然。

展开com.alibaba.druid.pool.DruidDataSource后看到大量的hashMap占用内存,原来是druid监控sql使用的,并不会释放。


http://www.mrgr.cn/news/100747.html

相关文章:

  • FPGA 39 ,FPGA 网络通信协议栈进阶,RGMII、ARP 与 UDP 协议与模块设计( RGMII、ARP、UDP原理与模块设计 )
  • Python自我娱乐小游戏:跳跳糖
  • Vue3 Echarts 3D圆柱体柱状图实现教程以及封装一个可复用的组件
  • MySQL基础篇 | 数据库概述及在TencentOS中安装MySQL8.0.42版本
  • 【学习资源】知识图谱与大语言模型融合
  • Python小程序:上班该做点摸鱼的事情
  • 大语言模型 04:模型量化详解 KTransformers MoE推理优化技术
  • ClickHouse副本集群
  • 连接私有数据与大语言模型的强大框架--LlamaIndex详细介绍与案例应用
  • CC52.【C++ Cont】滑动窗口
  • 什么是环境变量,main函数的命令行参数的概念和作用,以及进程地址空间详解
  • K8S ConfigMap 快速开始
  • 【Linux应用】在PC的Linux环境下通过chroot运行ARM虚拟机镜像img文件(需要依赖qemu-aarch64、不需要重新安装iso)
  • 详解操作系统是如何管理计算机软硬件资源的,以及Linux中进程状态的观察与解释
  • TCP概念+模拟tcp服务器及客户端
  • 拆固态硬盘短接开卡+ as ssd benchmark查看硬盘读写速度
  • iOS—仿tableView自定义闹钟列表
  • tbb parallel_for 使用教程1
  • 如何在 Postman 中,自动获取 Token 并将其赋值到环境变量
  • 【Prometheus-MySQL Exporter安装配置指南,开机自启】