排查CPU占用过高的一次经历
linux服务器上部署着一个工程,此工程是定时任务的集合,几乎承载着所有的定时任务,最近一段时间线上业务总出现莫名奇妙的数据不对的问题等等,查看了一下原因 是因为有些定时任务一直在TIME_WAITING,没有执行导致的。
以下为在linux上分析的过程:
1.使用top命令 查看cpu使用情况(实际情况是达到了85%,这是后期截的图)
2.PID为2423的java程序占用cpu比较大,之后具体看哪个线程占用cpu最多
命令:top -p 2423 -H
可以看出线程2438占用cpu最高!
3.此时我们需要查看线程2423是什么工程,需要借助jdk自带的jstack工具(注意jstack查看出的日志线程号都是16进制的)
转16进制:(分享一个个人的小技巧,使用浏览器自带的js完成)
4.进入jdk的bin目录下 执行以下命令
命令:./jstack 2423|grep 0x986
5.是个垃圾回收的进程,查看下垃圾回收日志
jstat查看进程内存状况
命令: jstat -gcutil 2423 2000 10
发现FGC特别大 E也几乎满了,继续分析需要dump出日志在分析.
6.使用jmap
命令导出heapdump文件,然后拿到本地使用jvisualvm.exe分析或者MAT工具(Memory Analyzer Tool)分析(我使用的是eclipse的MAT插件去分析的)。
命令: jmap [option] vmid
jmap -dump:format=b,file=dump.bin 2423
7.将dump日志 倒到本地 用MAT去分析
8.安装MAT插件
help->Install New Software
http://download.eclipse.org/mat/1.7/update-site/
安装完成,导致dump文件即可,如果你出现内存不够的情况,修改eclipse.ini文件, 改为-Xmx2048m即可解决。
9.导入dump文件分析
发现内存占用比较大,具体点Domiantor Tree查看是什么占用这么大内存
继续跟进查看具体的类,查到具体的类,定位到代码最后发现是代码层次的问题,内存中存放大量不需要存放的值,修改代码得以解决!
问题分析:
内存不足,导致java程序 疯狂的垃圾回收GC ,GC占用cpu资源没有释放,导致其他的定时任务无法正常运行!!!