记一次JVM故障排除

Posted icanhua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次JVM故障排除相关的知识,希望对你有一定的参考价值。

今天,自己开发的事件驱动的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故障排除的主要内容,如果未能解决你的问题,请参考以下文章

记一次linux Docker网络故障排除经历

记一次HBase RegionServer 经常挂掉 故障排查过程

记一次lvs-tunnel模式的故障分析(SYN_REC)

记一次线上Java程序导致服务器CPU占用率过高的问题排除过程

记一次线上Java程序导致服务器CPU占用率过高的问题排除过程

记一次线上Java程序导致服务器CPU占用率过高的问题排除过程