码迷,mamicode.com
首页 > 其他好文 > 详细

记一次JVM故障排除

时间:2019-03-15 09:14:39      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:jmap   信息   ror   inf   ast   观察   bin   splay   规模   

今天,自己开发的事件驱动的java大规模爬虫程序上线了几个新任务后突然异常。

异常:

   程序业务异常,经查看CPU利用率满,内存满,一直报OOM,目测有内存泄露。如下图所示,四核16G的内粗,CPU高达400%,内存使用了 6G,刚好爆满,JVM启动参数为:

java -server -Xmx6114M -Xms2048M -XX:+PrintGCDetails -XX:+PrintGCApplicationStoppedTime -Xloggc:/home/ubuntu/logs/spider/master/gc.log -XX:+PrintGCDateStamps -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/ubuntu/heap/spider/master/dump -jar /home/ubuntu/apps/spider-service/spider-master/current

内存截图:

技术图片

 

分析:

  首先找java进程为13419,找到该进程的什么线程使用最多,运行top -p 13419 -H  得到如下截图,一直观察得出,有四个线程一直占用100%的CPU;

 

技术图片

 

  于是设法找到CPU的线程的调用栈,运行 jstack 13419 >表示 jstack.log 查看文件信息,发现没有对应线程的状态,也就找不到调用栈(注意,想找线程nid,可能需要转换16进制表示,因为线程nid在jstack.log中为16进制)

  

技术图片

  

  想到这里,已经知道,该上面四个线程应该是GC线程,所以找不到,因此确定到处堆文件分析,于是运行 jmap -dump:live,format=b,file=heap-dump.bin 13419  获得堆文件;但首先我查看对象的统计情况,跑jmap histo >out.log 得到对象信息:

 

技术图片

  从上图可得,(S0为survive0区,S1为survive1区,而U代表使用,C代表总大小,E、O、M分别代表年轻代,年老代,Meta区,T为时间),一直发生YGC次数较多!

程序点:

后面分析堆文件找调用栈:

 

记一次JVM故障排除

标签:jmap   信息   ror   inf   ast   观察   bin   splay   规模   

原文地址:https://www.cnblogs.com/iCanhua/p/10534643.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!