利用 jstat监控和分析 JM 内部的垃圾回收、内存等运行状态。可以用它来查看堆内存、非堆内存等的实时状态。
可以使用 jmap 查看JVM 堆的详细信息(包括堆的配置、内存使用情况、GC活动等)。
在发生OOM时,可以根据 jmap 得到堆转储文件 (建议增加JVM启动参数,-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof,在发生 OOM 后自动生成装储文件),再导入到 MAT、VisualVM、GCeasy)等工具中分析文件,找出哪些对象占用了大量的内存,再定位到具体的代码解决问题,
JVM 当前的内存占用情况查看
- jstat
它是 JDK 自带的工县,用于监控JVM 各种运行时信息
jstat -gc <pid> 1000 10
- gc选项:显示垃圾收集信息(也可以用 gcutil,gcutil以百分比形式显示内存的使用情况,gc显示的是内存占用的字节数,以KB 的形式输出堆内存的使用情况)
- pid:Java 进程的 PID。
- 1000:每 1000 毫秒采样一次。
- 10:采样 10 次。
示例输出
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
1536.0 1536.0 0.0 0.0 30720.0 1024.0 708608.0 2048.0 44800.0 43712.6 4864.0 4096.0 4 0.072 1 0.015 0.087
1536.0 1536.0 0.0 0.0 30720.0 2048.0 708608.0 2048.0 44800.0 43712.6 4864.0 4096.0 4 0.072 1 0.015 0.087
1536.0 1536.0 0.0 0.0 30720.0 3072.0 708608.0 2048.0 44800.0 43712.6 4864.0 4096.0 4 0.072 1 0.015 0.087
字段含义:
- S0C(Survivor Space 0 Capacity):第一个 Survivor 区域的容量(字节数).
- S1C(Survivor Space 1 Capacity):第二个 Survivor 区域的容量(字节数)。
- S0U(Survivor Space 0 Utilization):第一个 Survivor 区域的使用量(字节数)
- S1U(Survivor Space 1 Utilization):第二个 Survivor 区域的使用量(字节数)。
- EC(Eden Space Capacity): Eden 区域的容量(字节数)。
- EU(Eden Space Utilization): Eden 区域的使用量(字节数)
- OC(Old Generation Capacity): 老年代的容量(字节数)
- OU(Old Generation Utilization): 老年代的使用量(字节数)
- MC(Metaspace Capacity):方法区(Metaspace)的容量(字节数)
- MU (Metaspace Utilization):方法区的使用量(字节数)。
- CCSC(Compressed Class Space Capacity): 压缩类空间的容量(字节数)
- CCSU(Compressed Class Space Utilization): 压缩类空间的使用量(字节数)
- YGC (Young Generation GC Count):年轻代垃圾回收的次数
- YGCT (Young Generation GC Time):年轻代垃圾回收的总时间(秒)。
- FGC (Full GC Count): full gc 的次数。
- FGCT(Full GC Time): full gc 的总时间(秒)。
- GCT(Garbage Collection Time): 总的垃圾回收时间(秒)。
注意:如果 FGC 变化频率很高,则说明系统性能和吞吐量将下降,或者可能出现内存溢出。
OOM分析
使用 jmap 工具生成堆转储文件
jmap -dump:format=b,file=heap_dump.hprof <pid>
大部分系统内存占用2GB~8GB,此命令会导致虚拟机暂停工作1~3秒左右
可以在 JVM 内存溢出后,主动 dump 生成文件,在启动时增加以下参数即可。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof
使用工具分析堆转储文件
再使用MAT 或 GCeasy等工具分析转储文件