近日测试时测试服务器总是爆出OOM: java head space,于是通过JVisualVM查看内存回收情况发现FullGC超频繁,垃圾回收不了
通过jmap取到内存数据
jmap -dump:format=b,file=heap.bin 进程号
用MemoryAnalyzer打开head.bin进行分析
可以看到com.mysql.jdbc.JDBC42ResultSet这个类产生的对象数据占了几乎全部
。
打开dominator_tree,,默认按数据量占比倒序排列,第一个就是我们要看的,于是展开如下图
基本上可以定位到是某条SQL的问题,这里执行了超多此产生的对象没有被回收
看到SQL的某个参数是:SIGNING_INFO_SYCN
联想到项目中的定时任务有失败补偿机制,至此,定位到具体代码,问题解决。