【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
相关推荐
dragoooon3442 分钟前
[Linux——Lesson23.线程概念与控制:线程基础]
java·开发语言·jvm
装不满的克莱因瓶1 小时前
【项目亮点】基于EasyExcel + 线程池解决POI文件导出时的内存溢出及超时问题
java·jvm·excel·线程池·async·虚拟机·easyexcel
麦麦鸡腿堡5 小时前
Java_HashMap底层机制与原码解读
java·开发语言·jvm
迦蓝叶6 小时前
通过 HelloWorld 深入剖析 JVM 启动过程
java·开发语言·jvm·aot·启动过程·helloword·leyden
moiumxf0278q19 小时前
C++中智能指针是如何工作的?
java·jvm·c++
tryxr21 小时前
变量捕获相关内容
java·开发语言·jvm
无敌最俊朗@1 天前
01-总结
java·jvm·数据库
zbhbbedp282793cl1 天前
unique_ptr和shared_ptr有何区别?
java·开发语言·jvm
AAA卷不动了1 天前
JVM(一)----- 类加载过程
jvm
大G的笔记本1 天前
Java JVM 篇常见面试题
java·开发语言·jvm