线上JVM堆内存报警,占用超90%
- [1. 背景](#1. 背景)
- [2. 是否存在内存泄漏?](#2. 是否存在内存泄漏?)
- [3. 通过jmap查看堆内存中对象分布](#3. 通过jmap查看堆内存中对象分布)
- [4. 查看源码](#4. 查看源码)
- [5. 为什么泄漏](#5. 为什么泄漏)
- [6. 排查总结](#6. 排查总结)
- 附录
1. 背景
JVM堆内存告警,占用超90%
2. 是否存在内存泄漏?
是否有内存泄漏呢,尝试触发一次FullGC jcmd $pid GC.run
。
在FullGC后,观察老年代还是占用很高,说明确实有泄漏。
jstat 是 JVM 统计监控工具(Java Virtual Machine Statistics Monitoring Tool),用于监控正在运行的 Java 进程的各种性能数据,比如垃圾回收(GC)、内存使用情况、编译行为等。
而 -gcutil 选项表示:以百分比形式显示 Java 各内存区域的使用情况,以及 GC 次数和总耗时。
命令参数详解
bash
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. 排查总结
