讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

Laper
Laper

剧本策划到成片协作

Seko
Seko

AI短剧一键生成成片

剧云
剧云

中文短剧剧本制作平台

实战 OOM 排查:利用 jmap 与 MAT 分析 Heap Dump 文件以定位海量 String 对象导致的内存溢出

大静同学_8911

大静同学_8911

发布时间:2026-05-04 10:52:06

|

169人浏览过

|

来源于php中文网

原创

核心是定位无节制创建/持有/缓存String的对象,jmap抓Heap Dump(优先live模式)、MAT分析引用链(聚焦Leak Suspects、Histogram、Dominator Tree及Path to GC Roots),结合常见泄漏场景验证修复。

实战 oom 排查:利用 jmap 与 mat 分析 heap dump 文件以定位海量 string 对象导致的内存溢出

遇到大量 String 对象引发的 OOM,核心不是“删掉字符串”,而是揪出谁在无节制地创建、持有、缓存它们。jmap 负责抓现场,MAT 负责审线索,两者配合才能快速定位根因。

用 jmap 抓取有效 Heap Dump

生产环境不能等 OOM 发生才动手,但也不能随便 dump——要兼顾准确性与影响可控。

  • 优先选 live 模式:执行 jmap -dump:live,format=b,file=heap.hprof <pid></pid>,只保留存活对象,文件更小、分析更快,也更贴近真实泄漏状态
  • 进程卡死时再用 -F 强制模式:如 jmap -F -dump:format=b,file=heap.hprof <pid></pid>,但会跳过 GC 清理,可能混入本该回收的对象,需在 MAT 中多一步过滤
  • 提前配置自动 dump 更稳妥:启动参数加上 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/dump/,OOM 一发生,快照就已落盘,避免人工干预延误
  • 注意磁盘和权限:String 堆积常导致 dump 文件达数 GB,确保目标路径有足够空间;运行 jmap 的用户需对 Java 进程有读权限,对输出目录有写权限

在 MAT 中聚焦 String 相关线索

MAT 不是看谁占内存多就点谁,而是顺着引用链,找到“不该活却一直活着”的源头。

  • 先看 Leak Suspects Report:打开 dump 后自动弹出,重点看 “One instance of ‘java.util.ArrayList’ dominates the heap” 这类提示——它背后往往就是 String 容器
  • 直奔 Histogram 视图,筛选 java.lang.String:右键 → “Group by: Package”,或直接在 Class Name 栏输入 java.lang.String;关注 “Retained Heap” 列,排序后看前几项——哪个包下的 String 占比异常高?
  • 点开高 Retained Heap 的 String 实例,查 Dominator Tree:看它被谁 dominator(支配),通常会指向某个静态 Map、ThreadLocal 或单例缓存对象
  • 右键 → Path to GC Roots → exclude weak/soft references:排除弱引用干扰,只看强引用链;如果路径终点是 java.lang.ThreadLocal$ThreadLocalMap 或 static final HashMap,基本锁定泄漏点

常见 String 泄漏场景与验证方式

不是所有 String 多都算问题,得判断是否“业务已结束,引用还挂着”。

  • 日志框架中的 MDC/NDC:比如 SLF4J 的 MDC.put("traceId", ...) 后未 clear(),线程复用时 traceId 累积;检查 ThreadLocalMap 中 key 为 MDC 的 entry 数量是否随请求增长
  • JSON 序列化缓存:FastJSON 或 Jackson 配置了全局缓存策略,反复解析相同结构的字符串,生成大量重复 String;在 Histogram 中观察是否出现大量内容高度相似的 String 实例
  • 静态集合误用:如 public static List<string> cache = new ArrayList();</string>,接口每调用一次就 add 一个 UUID 字符串,且无清理逻辑;MAT 中可看到该 List 的 size 持续增大,且每个元素都是新 String
  • 数据库字段映射不当:MyBatis 将 CLOB 或长文本字段映射为 String,但业务只取前 100 字符,却把整 MB 内容全加载进内存;结合 SQL 日志 + MAT 中 String 内容预览可快速识别

确认并修复后的关键验证动作

改完代码不等于问题消失,得用数据闭环验证。

  • 压测对比:用相同流量压测修复前后,观察堆内存使用曲线是否不再持续攀升,Full GC 次数是否下降
  • 监控新增指标:在应用中埋点统计关键缓存容器 size、MDC entry 数量、或自定义 JVM 指标(如 string_cache_size),接入 Prometheus+Grafana 实时观测
  • 保留一份修复前 dump 做基线:下次同类问题出现时,可用 MAT 的 Compare Basket 功能,快速比对 String 实例增长差异,节省 70% 分析时间

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

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

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

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

750

2025.09.05

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

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

343

2025.11.16

golang map原理
golang map原理

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

553

2025.11.17

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

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

323

2025.11.27

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

100

2026.11.12

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

60

2026.11.12

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

60

2026.11.12

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

160

2026.11.06

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

120

2026.11.06

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn