【JVM】线上JVM堆内存报警,占用超90%

线上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. 排查总结

附录

  1. 来源 https://www.bilibili.com/video/BV1Pw4m1D7WC/?spm_id_from=333.1387.upload.video_card.click&vd_source=240d9002f7c7e3da63cd9a975639409a
相关推荐
没有bug.的程序员1 天前
单体 → 微服务演进路径:一个真实电商项目的渐进式转型
jvm·微服务·云原生·架构·电商·gc调优
ss2731 天前
从零实现线程池:自定义线程池的工作线程设计与实现
java·开发语言·jvm
总是学不会.2 天前
【JUC编程】一、线程的基础概念
java·开发语言·jvm
while(1){yan}2 天前
JVM八股文
java·开发语言·jvm·java-ee
铁锚2 天前
JDK21与lombok插件的兼容性问题
jvm·maven
qq_377112372 天前
JAVA的平凡之路——此峰乃是最高峰JVM-GC垃圾回收器(1)-06
java·开发语言·jvm
熊猫吃竹子2 天前
JVM G1GC参数调优实战
jvm·后端
qq_377112372 天前
JAVA的平凡之路——此峰乃是最高峰JVM-GC垃圾回收器(2)-06
java·开发语言·jvm
深圳佛手2 天前
Java大对象(如 List、Map)如何复用?错误的方法是?正确的方法是?
java·jvm·windows
想学后端的前端工程师2 天前
【深入理解JVM内存模型与垃圾回收机制】
jvm