【JVM】线上JVM堆内存报警,占用超90%
线上JVM堆内存报警,占用超90%
- 1. 背景
- 2. 是否存在内存泄漏?
- 3. 通过jmap查看堆内存中对象分布
- 4. 查看源码
- 5. 为什么泄漏
- 6. 排查总结
- 附录
1. 背景
JVM堆内存告警,占用超90%
2. 是否存在内存泄漏?
是否有内存泄漏呢,尝试触发一次FullGC jcmd $pid GC.run
。
在FullGC后,观察老年代还是占用很高,说明确实有泄漏。
jstat 是 JVM 统计监控工具(Java Virtual Machine Statistics Monitoring Tool),用于监控正在运行的 Java 进程的各种性能数据,比如垃圾回收(GC)、内存使用情况、编译行为等。
而 -gcutil 选项表示:以百分比形式显示 Java 各内存区域的使用情况,以及 GC 次数和总耗时。
命令参数详解
jstat -gcutil <vmid> <interval> <count>
参数 | 说明 |
---|---|
<vmid> | 目标 JVM 的进程 ID(PID),可以用 jps 命令查看。 |
<interval> | 每次采样的时间间隔(单位:毫秒)。 |
<count> | 采样的次数。 |
上面结果字段
字段 | 含义 | 说明 |
---|---|---|
S0 | Survivor 0 区使用率(%) | Eden 区回收后,幸存对象复制到 S0 |
S1 | Survivor 1 区使用率(%) | S0 与 S1 交替使用 |
E | Eden 区使用率(%) | 新生代中最先放入对象的区域 |
O | Old 区使用率(%) | 老年代的使用率 |
M | Metaspace(元空间)使用率(%) | JDK8 之后替代永久代(PermGen) |
CCS | 压缩类空间(Compressed Class Space)使用率(%) | 用于存放类的元数据信息 |
YGC | Young GC 次数 | 新生代垃圾回收次数 |
YGCT | Young GC 总耗时(秒) | 新生代 GC 总耗时 |
FGC | Full GC 次数 | Full GC 次数(全堆 GC) |
FGCT | Full GC 总耗时(秒) | Full GC 总耗时 |
GCT | 总 GC 耗时(秒) | YGCT + FGCT |
3. 通过jmap查看堆内存中对象分布
可以看到有大量Hadoop包的StatisticsData对象。
4. 查看源码
5. 为什么泄漏
6. 排查总结
附录
- 来源 https://www.bilibili.com/video/BV1Pw4m1D7WC/?spm_id_from=333.1387.upload.video_card.click&vd_source=240d9002f7c7e3da63cd9a975639409a