1、GC日志分析
除了CMS的日志和其他GC的日志差别较大外,它们都可以抽象成如下格式
[GC [<collector>:<starting occupancy1>-><ending occupancy1>(total size1), <pause time1> secs] <starting occupancy2>-><ending occupancy2>(total size2), <pause time2> secs]
<collector>GC 表示收集器的名称
<starting occupancy1> 表示 Young 区在 GC 前占用的内存
<ending occupancy1> 表示 Young 区在 GC 后占用的内存
<pause time1> 表示 Young 区局部收集时 JVM 暂停处理的时间
<starting occupancy2> 表示 JVM Heap 在 GC 前占用的内存
<ending occupancy2> 表示 JVM Heap 区在 GC 后占用的内存
<pause time2> 表示 GC 过程中 JVM 暂停处理的时间
可以根据:
<ending occupancy1> - <starting occupancy1> 和 <ending occupancy2> - <starting occupancy2>
判断是否存在内存泄漏
还可以使用 jstat -gcutil [pid] [interval] [count] 进行分析
各参数分别代表:
S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒) FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒) GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
2、堆快照文件分析
jmap -dump:format=b file=[filename] [pid]
记录堆的内存快照,然后利用工具 mat 分析整个 Heap 的对象关联情况
如果内存耗尽那么可能导致JVM直接垮掉,通过参数:-XX:+HeapDumpOnOutOfMemoryError 可记录内存快照,-XX:HeapDumpPath 指定文件路径
3、JVM Crash 日志分析
JVM 退出时一般会在工作目录产生日志文件,也可 -XX:ErrorFile=/path/of/file 指定