“雁过留声,人过留痕” 服务异常停止如何排查

losetowin 发布于:2016-12-18 19:20 分类:技术  有 3729 人浏览,获得评论 0 条 标签: jvm参数 

本文地址:http://www.dutycode.com/fu_wu_yi_chang_zhong_zhi_pai_cha.html
除非注明,文章均为 www.dutycode.com 原创,欢迎转载!转载请注明本文地址,谢谢。



题图:来自花瓣

场景

   某个java服务运行于线上,突然某天异常停止了,该如何排查?

分析

服务异常终止的原因有很多,比如内存溢出,但进程一旦消失之后,想查找问题便很难,难在没有现场了。这时候,我们原本采用的一些手段比如jmap、jstack等在这里便用不上了。想确认是哪段代码导致内存溢出便很难了。

本文仅描述由于内存溢出导致进程突然终止的情况。 

所以,我们需要在服务终止的时候,留下痕迹。供我们后续排查。

JVM本身提供了这样的参数,可以保证服务由于内存溢出的情况终止的时候,dump一份堆内存快照到指定目录。也就给我们留下了痕迹,可以用于后续的问题排查。 

JVM参数为: -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=保存目录

HeapDumpOnOutOfMemoryError : 当JVM遇到OutOfMemoryError时执行Dump操作

HeapDumpPath:dump文件保存的目录


例子

代码如下:

代码

public class OutOfMemErrDemo {
    public static void main(String[] args) {
         int[] tmp = new int[0];
         for (int i = 1; i < 10000000; i=3*i){
            tmp = new int[i];
         }
     }

}


JVM参数如下:

JVM参数

-Xmx40m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tmp


很快就能看到结果了,
http://7xo6kd.com1.z0.glb.clouddn.com/upload-ueditor-image-20161218-1482056354547073166.png
通过MAT之后可以看到int占的内存最大。
http://7xo6kd.com1.z0.glb.clouddn.com/upload-ueditor-image-20161218-1482056370616093284.png
类似的,如果线上出现此类问题,可以通过这种方式留下现场,根据内存占用情况,可以反查代码,得到内存泄露的原因。 



个人公众号:攀爬蜗牛  dutycode_com    文章会在公众号首发。



版权所有:《攀爬蜗牛》 => 《“雁过留声,人过留痕” 服务异常停止如何排查
本文地址:https://www.dutycode.com/fu_wu_yi_chang_zhong_zhi_pai_cha.html
除非注明,文章均为 《攀爬蜗牛》 原创,欢迎转载!转载请注明本文地址,谢谢。