JVM内存问题分析

一、GC日志分析

为了在内存溢出时排查原因,可以在JVM启动时加一些参数来控制,当JVM内存出问题时可以通过分析记录下来的GC日志,GC的频率和每次GC回收了哪些内存

GC的日志输入有以下参数

1、verbose:gc  可以辅助输出一些详细的GC信息

2、-XX:+PrintGCDetails  输出GC的详细信息

3、-XX:+PrintGCApplicationStoppedTime  输出GC造成应用程序暂停的时间

4、-XX:+PrintGCDateStamps  输出GC发生的时间信息

5、-XX:PrintHeapAtGC  在GC前后输出堆中各个区域的大小

6、-Xloggc:[file]  将GC信息输出到单独的文件

每种GC方式输出日志的形式不同,除CMS的日志和其他GC方式差异较大外,其余GC方式的日志可以抽象成如下方式

[GC [<collector>: <starting occupancy1> -> <ending occupancy1> (total size1) , <pause time1> secs]

<starting occupancy2> -> <ending occupancy2> (total size2) , <pause time2> secs] ]

说明如下

1、<collectot>GC  表示垃圾收集器的名称

2、<starting occupancy1>  表示Young区在GC前占用的内存

3、<ending occupancy1>  表示Young区在GC后占用的内存

4、(total size1)  表示Young区的总内存大小

5、<pause time1>   表示Young区局部收集时JVM暂停处理的时间 secs表示单位秒

6、<starting occupancy2>   表示Heap在GC前占用的内存

7、<ending occupancy2>  表示Heap在GC后占用的内存

8、(total size2)  表示Heap的总内存

9、<pause time2>  表示在GC过程中JVM暂停处理的总时间

可以根据日志来判断是否存在内存泄漏的问题:

<starting occupancy1> - <ending occupancy1>  和 <starting occupancy2> - <ending occupancy2> 比较

1、如果前者差等于后者差,表明Young区GC 对象100%被回收,没有对象进入 Old区或者Perm区

2、如果前者大于后者,那么差值就是这次GC对象进入Old或者Perm区的大小

如果随着时间的的延长,<ending occupancy2>的大小一直在增长,而且Full GC很频繁,那么很可能就是内存泄漏导致的。

猜你喜欢

转载自www.cnblogs.com/yangyongjie/p/10660517.html
今日推荐