0

0

什么是Java中的内存泄露排查流程_jmap导出dump与MAT工具分析

P粉602998670

P粉602998670

发布时间:2026-02-24 17:52:02

|

308人浏览过

|

来源于php中文网

原创

确认内存泄漏需观察老年代使用率“只涨不跌”、fgc频次激增且回收无效、oom频繁复现、特定类实例持续增长;jmap加live可导出纯净堆快照;mat中通过path to gc roots查强引用链,dominator tree定位真正内存支配者。

什么是java中的内存泄露排查流程_jmap导出dump与mat工具分析

怎么确认真有内存泄漏,而不是GC波动?

别急着 jmap,先看现象是否符合泄漏本质:老年代内存「只涨不跌」。比如 jstat -gcutil <pid> 1000 5</pid> 连续采样,发现 O(Old space 使用率)从 70% → 85% → 92% → 96% → 98%,且每次 FGC 后几乎没回落,这就不是正常业务高峰,是泄漏信号。

  • Full GC 频次越来越高(比如从每小时 1 次变成每分钟 2 次),单次耗时超 1s,同时 FGCT 累计值快速上升
  • 应用日志里反复出现 java.lang.OutOfMemoryError: Java heap space,重启后几小时内复现
  • jmap -histo:live <pid></pid> 隔 5 分钟跑两次,对比发现某类实例数(如 com.example.UserCacheEntry)持续增长、不减

jmap 导出 dump 时,为什么加 live 很关键?

jmap -dump:format=b,file=heap.hprof <pid></pid> 会触发一次全局 Stop-The-World,导出所有对象(包括已标记待回收但还没清理的)。而生产环境更推荐 jmap -dump:live,format=b,file=heap.hprof <pid></pid> —— 它强制先做一次 Full GC,再 dump 剩下的「活对象」,数据更干净,避免把临时对象噪音带进分析。

  • 不加 live:dump 文件大、MAT 分析慢、容易被短生命周期对象干扰判断
  • live:文件小 30%~50%,Leak Suspects 报告更准,但会短暂卡顿(STW 时间取决于老年代大小)
  • 线上慎用:若服务敏感,优先依赖启动参数 -XX:+HeapDumpOnOutOfMemoryError 自动捕获,而非手动触发

MAT 中怎么看懂「Path to GC Roots」里的引用链?

打开 dump 后点 Leak Suspects Report,它标出的嫌疑对象只是起点;真正要动手改代码,得点进去看 Path to GC Roots —— 这里显示的是「谁在强持有这个对象,让它没法被回收」。

68爱写
68爱写

专业高质量AI4.0论文写作平台,免费生成大纲,支持无线改稿

下载
  • 看到 static 字段(如 com.example.CacheManager.cache)→ 典型静态集合泄漏,检查是否漏清理或没设过期
  • 看到 java.lang.Thread 持有 → 查线程栈,可能是线程池任务中缓存了大对象或未关闭 ThreadLocal
  • 看到 org.springframework.context.support.AbstractApplicationContext → Spring Bean 生命周期异常,比如监听器注册后没注销
  • 注意过滤:勾选 exclude all phantom/weak/soft references,只看强引用链,否则会看到大量无意义路径

为什么用 Dominator TreeHistogram 更快定位根因?

Histogram 只告诉你「哪个类实例最多」,比如 byte[] 占内存第一——但这没用,因为几乎所有大对象底层都是 byte[]Dominator Tree 才是关键:它按「支配关系」排序,排第一的,是那些「自己占内存多 + 它活着就拖着一堆其他对象也活不了」的对象。

立即学习Java免费学习笔记(深入)”;

  • Retained Heap 最大的几行,比如 com.example.OrderService 实例占 1.2GB → 直接去查这个类的静态字段或单例状态
  • 右键 → Path to GC Roots → 看是不是被某个 static Map 或未 shutdown 的 ScheduledExecutorService 持有
  • 如果 Dominator Tree 顶部全是第三方库类(如 io.netty.buffer.PooledByteBuf),别急着改自己代码,先查 Netty 是否漏调 release()

真正难的不是找到那个大对象,而是看懂它为什么不该活那么久——引用链里每个箭头,都对应一行可能漏掉的 remove()close()shutdown()

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

144

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

81

2026.01.26

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

866

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

452

2024.06.27

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

422

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

595

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

422

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

595

2023.08.10

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

1

2026.02.24

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.9万人学习

C# 教程
C# 教程

共94课时 | 10.1万人学习

Java 教程
Java 教程

共578课时 | 71.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号