【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
相关推荐
鼠鼠我捏,要死了捏5 小时前
深度解析JVM GC调优实践指南
java·jvm·gc
IT·陈寒5 小时前
当 JVM 开始“内卷”:一次性能优化引发的 GC 战争
java·jvm·性能优化
No8g攻城狮9 小时前
【异常解决】使用DateUtil.isSameDay()方法判断秒级时间戳是否属于同一天踩过的坑
java·jvm·spring boot·java-ee·springboot
天若有情6739 小时前
TFword:从字符到片段,解析一个“小而精”的字符串处理工具的设计智慧
java·jvm·算法
那我掉的头发算什么9 小时前
【数据结构】反射、枚举、lambda表达式以及补充知识
java·jvm·数据结构·intellij idea
沐浴露z1 天前
【JVM】详解 Class类文件的结构
java·jvm·class
爬虫程序猿1 天前
把“天猫”装进 JVM:Java 关键词商品爬虫从 0 到 1(含完整可运行代码)
java·jvm·爬虫
stillaliveQEJ1 天前
【JVM】基础概念之为什么要使用JVM
jvm
维诺菌1 天前
k8s java应用pod内存占用过高问题排查
java·jvm·云原生·容器·性能优化·kubernetes