内存溢出诊断:jmap与jstat工具的实战应用技巧

冷漠man

冷漠man

2026-07-15

971人浏览

原创

jstat用于实时监控内存变化趋势,jmap用于精准定位内存占用元凶,二者配合可高效诊断内存问题:jstat关注ou、fgct等指标发现泄漏苗头,jmap-histo:live统计存活对象锁定嫌疑类,再结合dump与mat分析引用链追溯泄漏根源。

内存溢出诊断:jmap与jstat工具的实战应用技巧

内存溢出不是突然发生的,而是长期积累的结果。jstat 能帮你“看见趋势”,jmap 则帮你“锁定元凶”——两者配合,才是诊断内存问题的正确打开方式。

jstat 实时盯住内存变化,发现异常苗头

jstat 不干扰应用运行,适合在生产环境持续观察。关键不是看单次数值,而是看变化节奏:

  • 重点关注 OU(老年代使用量)和 FGCT(Full GC 耗时):如果 OU 持续上升、FGCT 频次增加且每次耗时变长,说明对象正在堆积且难以回收,大概率存在泄漏或大对象驻留
  • 留意 EU(伊甸园区使用率)是否长期卡在高位却不触发 YGC:这可能意味着 Eden 区设置过大,或应用实际创建对象极少,需结合业务逻辑判断是否合理
  • 用 jstat -class 查类加载趋势:Loaded 类数持续增长、Unloaded 几乎为 0,可能是 ClassLoader 泄漏,尤其在热部署频繁或动态代理多的场景

jmap 快速定位“谁占了最多内存”

当 jstat 提示异常后,立刻用 jmap 精准扫描堆中对象分布:

php版微信js-sdk支付接口类
php版微信js-sdk支付接口类

php版微信js-sdk支付接口类

下载
  • jmap -histo:live :只统计当前存活对象,结果按占用字节倒序排列。重点关注排在前几的数组类型(如 [B、[C)、String、HashMap$Node 或业务自定义类
  • 注意对象描述符含义:[B 是 byte[],[C 是 char[],[I 是 int[],L开头如 Ljava/lang/String; 表示类实例;数组类名含 [L 表示对象数组
  • 对比两次 histo 输出:间隔几分钟分别执行,若某类实例数/字节数明显增长且不回落,基本可圈定嫌疑对象

jmap dump + MAT 深度分析泄漏路径

当怀疑存在泄漏但 histo 不够明确时,导出堆快照交给专业工具分析:

  • 生成 dump 文件:jmap -dump:format=b,file=heap.hprof 。注意磁盘空间充足,文件通常数百 MB 起
  • 优先用 MAT 打开:加载后先看 “Leak Suspects” 报告,它会自动标出最可能的泄漏点;再进 “Dominator Tree”,按 retained heap 排序,找持有大量子对象的根节点
  • 顺着引用链往回查:右键对象 → “Path to GC Roots” → 选择 “with all references”,重点看哪些静态变量、缓存容器、监听器或线程局部变量意外持有了本该释放的对象

操作注意事项与避坑提醒

工具好用,但用错时机或权限容易白忙一场:

  • jmap -histo 默认不加 :live 会统计所有对象(含待回收),干扰判断,线上排查务必加 :live
  • jmap dump 会触发全局 safepoint,导致应用短暂卡顿,避开高峰期;容器环境需提前配置 --cap-add=SYS_PTRACE
  • 普通用户只能 attach 自己启动的 Java 进程,排查他人进程需 root 权限或协调运维协助
  • 别等 OOM 才行动:可在 JVM 启动时加上 -XX:+HeapDumpOnOutOfMemoryError,让崩溃时自动保存现场

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

130

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

223

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

350

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

139

6

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

1806

8

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.28

888

5

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1150

5

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

2023.08.17

7861

11

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

637

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 18.8万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.3万人学习