【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
相关推荐
金銀銅鐵10 小时前
同一个 Hello World,Kotlin 和 Java 在字节码层面差在哪
jvm·后端·kotlin
yeccheng2 天前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试
On The Road :4 天前
深入理解 JVM 垃圾回收:GC 是什么、如何判定垃圾、四大回收算法全解析
jvm·算法
Yves..4 天前
JVM 学习笔记:内存区域、类加载机制与垃圾回收
jvm
akinggw5 天前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
yh弓长5 天前
JVM 核心机制
jvm
tg_xianheyun6 天前
腾讯云国际账号注册代充值适合哪些海外业务场景?
jvm
yuniko-n6 天前
【JVM】对象内存布局
java·开发语言·jvm
wuminyu6 天前
JVM执行引擎学习总结:热点字节码编译成本地机器码
java·linux·c语言·jvm·c++
wuminyu6 天前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++