Druid版本
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.16</version>
</dependency>
现象 😣
早上起来看到告警群中全部都是项目到FullGC告警,其中还夹杂着部分OOM的告警. 甚至还有2台Tomcat没有上线也存在这个情况.
说明不是外部请求导致的. 且该项目后台启动了一个线程用于消费消息队列.
处理问题 🌲
看实例对象
有问题,但是看不出来啥.
看堆栈
使用
对 jstack 生成对堆栈进行分析,一无所获. 处于 Runnable 中的线程寥寥无几.. 根据不包含这个数据
dump 😂
命令 jmap -dump:live,format=b,file=pid.hprof pid
使用 mat 打开dump文件,可以直观的看到
什么鬼东西占了这么多,对
Incoming 和 Outcoming 一顿乱点,实在是看不出来
换成 JProfiler 试试 (刚下载把玩,感觉和mat差不多,界面美观不少)
打开dump下来对hprof文件. 和MAT显示的差不多.
com.alibaba.druid.stata.JdbcDataSourceStat$1 这个竟然包含了这么多,有经验的开发者都知道 $1 是类内部的一个实例类. 举个例子.
源文件
编译后的class文件...
打开 idea 开始看这个类.
在看是在哪里
put 数据的
到这里基本上就明白了,是因为配置
DataSource 的时候 Filter 配置了 stat 参数. 快速去掉发布上线.
第二天一看,稳的一批..
总结
看这个dump文件是比较难受,不会熟练. 很想知道根据这个对象来找到它的堆栈入口,各种点,结果根本就没有,这里还是思考🤔方向错误了. 下次就不会如此了.
这个Filter是用于界面看数据使用的,如果我们不看或者是有其他途径看sql,其实是可以关闭的.
思考
在什么情况下 sqlStatMap 会把数据给清空呢? 又是源于什么导致Map堆积了这么多的数据呢?