赞
踩
发现项目运行一段时间后会莫名其妙的不运行了,没有任何异常日志,好像被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帮助分析出来的两个问题。
第一个为jdbc的JDBC42ResultSet
,其所占用的堆内存大小为48.97%,但是Details中并看不到什么有用的信息,因此看另外一个问题,另外一个问题是在一个线程中,进入Details中查看详细信息。
通过详细信息可看到线程名为task-1的线程中,有一个List,List中有N个我们自定义的类对象,与上边查看类占用内存所查看到类为同一个类,因此确定问题在这里出现,因为线程名为tast-1,我们设置的Spring Schedule的线程名称前缀为task-
,再次查看Thread Stack可以定位到具体调用的代码位置,其中有一个定时任务为将表中部分数据取出来进行视频下载的操作,由于网速慢,导致线程一直在执行,并且由于配置原因,定时任务执行频率为4s一次,由于我们的list的循环并没有执行结束,引用一直在,所以不能被回收掉,导致old区占满,所以调整定时任务执行频率,问题解决。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。