排查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资源没有释放,导致其他的定时任务无法正常运行!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值