OOM排查

OOM排查过程步骤

1、先查看应用进程号pid:     ps  -ef | grep  应用名

2、查看pid垃圾回收情况:  jstat  -gc  pid  5000(时间间隔)

即会每5秒一次显示进程号为68842的java进成的GC情况,显示内容如下图:

OOM排查_第1张图片

结果说明:显示内容说明如下(部分结果是通过其他其他参数显示的,暂不说明):

S0C:年轻代中第一个survivor(幸存区)的容量 (字节) 

S1C:年轻代中第二个survivor(幸存区)的容量 (字节) 

S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节) 

S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节) 

EC:年轻代中Eden(伊甸园)的容量 (字节) 

EU:年轻代中Eden(伊甸园)目前已使用空间 (字节) 

OC:Old代的容量 (字节) 

OU:Old代目前已使用空间 (字节) 

PC:Perm(持久代)的容量 (字节) 

PU:Perm(持久代)目前已使用空间 (字节) 

YGC:从应用程序启动到采样时年轻代中gc次数 

YGCT:从应用程序启动到采样时年轻代中gc所用时间(s) 

FGC:从应用程序启动到采样时old代(全gc)gc次数 

FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s) 

GCT:从应用程序启动到采样时gc用的总时间(s) 

NGCMN:年轻代(young)中初始化(最小)的大小 (字节) 

NGCMX:年轻代(young)的最大容量 (字节) 

NGC:年轻代(young)中当前的容量 (字节) 

OGCMN:old代中初始化(最小)的大小 (字节) 

OGCMX:old代的最大容量 (字节) 

OGC:old代当前新生成的容量 (字节) 

PGCMN:perm代中初始化(最小)的大小 (字节) 

PGCMX:perm代的最大容量 (字节)   

PGC:perm代当前新生成的容量 (字节) 

S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比 

S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比 

E:年轻代中Eden(伊甸园)已使用的占当前容量百分比 

O:old代已使用的占当前容量百分比 

P:perm代已使用的占当前容量百分比 

S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节) 

S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节) 

ECMX:年轻代中Eden(伊甸园)的最大容量 (字节) 

DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满) 

TT: 持有次数限制 

MTT : 最大持有次数限制 

3、开启OOM快照: 

-XX:+HeapDumpOnOutOfMemoryError(开启堆快照)

-XX:HeapDumpPath=C:/m.hprof(保存文件到哪个目录)

4、dump 查看方法栈信息:

jstack -l  pid  >  /home/test/jstack.txt

5、dump 查看JVM内存分配以及使用情况

jmap  -heap  pid  >  /home/test/jmapHeap.txt

6、dump jvm二进制的内存详细使用情况 (效果同在Tomcat的catalina.sh中添加 set JAVA_OPTS=%JAVA_OPTS% -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/test//oom.hprof  此文件需要借用内存分析工具如:Memory Analyzer (MAT)来分析)

jmap -dump:format=b,file=/home/test/oom.hprof  pid

 

OOM一般有以下两种情况:

1、年老代堆空间被占满

异常:java.lang.OutOfMemoryError:java  heap space

说明:这是最典型的内存泄漏方式,简单说就是所有堆空间都被无法回收的垃圾对象占满,虚拟机再也无法分配新空间

解决方案:这种方式解决起来比较简单,一般就是根据垃圾回收前后的情况对比,同时根据对象引用情况(常见的集合对象引用)分析,基本都可以找到泄漏点

2、持久代被占满

异常:java.lang.OutOfMemoryError:PermGen space

说明:Perm 空间被占满,无法为新的 class 分配存储空间而引发的异常。这个异常以前是没有的,但是在 java 大量使用反射的今天这个异常就比较常见了。主要原因是大量动态反射生成的类不断被加载,最终导致 Perm 区被占满。更可怕的是,不同的 classLoader 即便使用相同的类,但是都会对其进行加载,相当于同一个东西,如果有 N 个classLoader 那么它将会被加载 N 次。因此,在某些情况下,这个问题基本视为无解,当然,存在大量 classLoader 和大量反射类的情况并不多

解决方案:增加持久代内存 ,例如:-XX:MaxPermSize=16M

你可能感兴趣的:(JVM)