[关闭]
@joshsulin 2017-07-05T11:09:54.000000Z 字数 933 阅读 1441

记一次java内存溢出问题排查过程

java


一、定位问题(监控或者日志)
日志: java.lang.OutOfMemoryError: Java heap space
此处输入图片的描述

通过听云监控, 该项目非常不稳定。通过线上服务器日志查看, 报内存溢出, 初步判断就是内存溢出引起的服务奔溃。

二、工具验证, 是否内存占满?
1、引入工具 jstat

  • jstat的用法
  • 用以判断JVM是否存在内存问题呢?如何判断JVM垃圾回收是否正常?一般的top指令基本上满足不了这样的需求,因为它主要监控的是总体的系统资源,很难定位到java应用程序。
  • Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。由于JVM内存设置较大,图中百分比变化不太明显
  • 一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。
    具体的看网上资料: http://www.51testing.com/html/92/77492-203728.html
2、执行命令查看(证明内存溢出)
>* jstat -gcutil 12743 1000 1000

![此处输入图片的描述][2]

要明确看懂这个数据, 需要对JVM内存分区及GC细节清楚, 初步扫肓可以参考: http://fredlong.iteye.com/blog/1746714
初步判断是否存在问题, 如果 S0、S1、E 都达到100左右了, 那肯定是内存溢出了。
接下来, 我们需要查明内存里存的内容是什么?

3、引入工具 jmap
>* 得到运行java程序的内存分配的详细情况。例如实例个数,大小等 
>* 运行命令: jmap -histo:live 37994 

当时发现某一个自定义对象占用内存非常多, 其实只要发现我们自己写的类占用内存非常多时,往往就是我们代码的问题。
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注