天天看点

线上项目频繁Full GC问题排查解决

现象

发现项目运行一段时间后会莫名其妙的不运行了,没有任何异常日志,好像被hung住了一样,不工作了。

排查

1、首先查看GC日志,通过

jstat -gcutil -t pid 1000 1000

查看GC日志,看到FullGC的次数达到了接近两万次。。。并且GC速率没有下降的趋势。

2、又通过

jmap -heap pid

查看堆内存情况,发现Old区Free剩余2M。。

3、通过

jmap -hsito pid

查看哪些类占用的空间多,看到我们自定义的一个类占用很大,因此定位到是我们项目的代码问题。

4、通过

jmap -dump:format=b,file=xxxx.hprof

Dump下我们的堆内存日志,通过MAT内存分析工具分析日志。查看到MAT帮助分析出来的两个问题。

线上项目频繁Full GC问题排查解决

第一个为jdbc的

JDBC42ResultSet

,其所占用的堆内存大小为48.97%,但是Details中并看不到什么有用的信息,因此看另外一个问题,另外一个问题是在一个线程中,进入Details中查看详细信息。

线上项目频繁Full GC问题排查解决

通过详细信息可看到线程名为task-1的线程中,有一个List,List中有N个我们自定义的类对象,与上边查看类占用内存所查看到类为同一个类,因此确定问题在这里出现,因为线程名为tast-1,我们设置的Spring Schedule的线程名称前缀为

task-

,再次查看Thread Stack可以定位到具体调用的代码位置,其中有一个定时任务为将表中部分数据取出来进行视频下载的操作,由于网速慢,导致线程一直在执行,并且由于配置原因,定时任务执行频率为4s一次,由于我们的list的循环并没有执行结束,引用一直在,所以不能被回收掉,导致old区占满,所以调整定时任务执行频率,问题解决。