一次内存溢出的排查

前一段时间,服务器cpu使用率达到100% 导致web网站无法访问,经过我熬夜的排查解决问题,此时想起来,将排查的方法写出来,方便没有解决过此类问题的人操作,服务器使用的是windows server 2008

1、问题出现现象,收到网站报警短信,登陆服务器,发现cpu使用率是100%,打开资源管理器,查看进程,消耗cpu的是java进程

2、开始排查,使用的工具 Process Explorer 

下载地址 https://download.youkuaiyun.com/download/fengkuangshangdi/11008228

  运行 Process Explorer 工具 出现如下界面,

双击要检测的进程,可看出运行中的线程,可更具cpu的使用情况排序获取此时最多cpu的tid

2、在出现cpu使用率100%时 打开cmd命令窗口运行如下命令

jstack -l 9828  > d:/java.stack      其中9828是进程PID   d:/java.stack  是将文件存放的地址

 

得到文件如下 java.stack 文件 图片是部分内容 ,

根据 Process Explorer  可获取此时最消耗cpu的线程 tid 如上图 

将tid 转换成16进制  在java.stack中搜索,发现 最消耗cpu的是 VM THread

,这一等是java的GC 造成的,于是猜想是代码中有大对象的查询

打开 java自带的 jvisualvm 工具监控GC情况,(猜测过程不写了)

办法 1、不再需要其他工具,

     直接在 java.stack 文件中挨个查看线程,分析代码,( 如果 java.stack内容不大,我使用的此方法,并成功找出问题 )

办法2、此办法是我在问题解决后研究的,比第一个省力很多……

在tomcat  catalina.bat最上方配置 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D://tmp/heapdump.hprof 

在内存溢出时会输出堆信息 到 D://tmp/heapdump.hprof。再 使用 Eclipse Memory Analyzer工具可快速定位到导致问题的类 再结合java.stack ,可快速找到问题

Eclipse Memory Analyzer使用方法不在此赘述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值