一、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很频繁,那么很可能就是内存泄漏导致的。