线上内存溢出问题排查

【实践是检验真理的唯一标准】
一、概述
之前写过 《性能的一些常用的命令与注意点、《java jvm内存结构(回顾) 《

JVM内存回收机制及回收器-一目了然 等篇文章今天写下实践吧,比较简单。 也正好前几天出现一个内存的问题。

二、线上准备数据
线上服务器跑得好好,突然服务不可用了,怎么办?
1、登陆服务器,立马从LB拉下。
2、快速jps,jstat -gcutil 12345看下。
3、如果是内存溢出再down(jmap -dump:live,format=b,file=heap.bin 32471)出堆分析,同时打出线程栈。
4、重启。
5、拉上f5。
当然事先配置一些参数,让系统出现内存溢出的时候自动打出堆栈(-XX:+HeapDumpOnOutOfMemoryError),也是非常好的办法。

     如果是整个集群出现问题,那把别的机器全部重启,留一台分析。如果实在不行,那就只能回滚代码了。
【ps:如果是内存出现问题,一般很少直接挂掉,回收线程还在做最后的挣扎,cpu利用率也非常高。整个load也上去了。整个jvm就会挂在哪里,一动不动了。 估计也不会自动打出堆栈了,还得手工上弄啊。】

三、线下分析
我一般使用mat(http://www.eclipse.org/mat/)(mat的堆开大点,默认的会内存溢出的)分析堆:
此是此次故障down下来的 用mat分析的 图形。
 
     再从 Dominator tree进去,发现
     展开后:发现是此线程持有的一些数据:再从数据中寻找 是什么原因引起的。(一般都能查到问题的)
可以看到整个对象的具体数值:
四、最后
    分析好原因后,该干嘛就干嘛吧! 基本是代码写的不好、一些接口没有做幂等控制的。

【对于线上内存溢出hold的问题,您有啥好的解决方案吗?请留言!您的评论是我写博文的最大动力。】



展开阅读全文

没有更多推荐了,返回首页