【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
相关推荐
whaledown9 小时前
互联网大厂Java求职面试三轮提问详解(涵盖Spring Boot、微服务、Kafka等核心技术)
java·jvm·数据库·spring boot·微服务·面试·kafka
hdsoft_huge11 小时前
JDK系列19:JVM全维度调优实战,内存、元空间、线程栈、GC参数压测调优完整方案
java·开发语言·jvm
-西门吹雪1 天前
现代C++ 并发编程-学习指南
java·jvm·c++
阿pin1 天前
Java随笔-GC收集器工作机制
java·开发语言·jvm·gc
自由的裙子1 天前
How-To: Using the N* Stack, part 4
java·jvm·oracle
阿pin1 天前
Java随笔-JVM内存模型
java·开发语言·jvm·内存模型
wuminyu2 天前
Java NIO内存管理与零拷贝深度剖析
java·linux·c语言·jvm·c++
zhixingheyi_tian2 天前
JVM 之 GCLocker
java·jvm
标致的钢铁侠2 天前
c# 温故而知新: 线程篇(一)
java·jvm·c#
盐焗鹌鹑蛋2 天前
【C++】多态
java·jvm·c++