0

0

什么是Java中的内存泄露与内存溢出_典型场景排查与诊断工具使用

P粉602998670

P粉602998670

发布时间:2026-03-14 08:59:31

|

630人浏览过

|

来源于php中文网

原创

判断Java内存泄漏应优先使用jstat -gcutil监控GC趋势,重点关注OU单向爬升、EU下降幅度减小、S0U/S1U长期满载;再用jmap -histo:live轻量筛查异常对象,最后用MAT手动分析GC Roots定位隐式引用链。

什么是java中的内存泄露与内存溢出_典型场景排查与诊断工具使用

内存泄漏不等于内存溢出,但长期泄漏几乎必然导致溢出。 判断一个 Java 服务是否在“悄悄 leak”,关键不是等 OutOfMemoryError 报出来——那时往往已错过黄金干预窗口;而是看堆内存是否呈现「缓慢上涨、GC 后不回落、老年代持续堆积」的特征。

怎么快速确认是不是内存泄漏?看 jstat 的 GC 趋势

真正有用的信号不在日志里,而在运行时的 GC 行为。用 jstat -gcutil <pid> 2000</pid> 每两秒刷新一次,重点盯三个指标:

  • S0U/S1U:幸存区使用率,频繁波动正常;若长期接近 100% 且不回收,说明对象没被及时晋升或清理
  • EU(Eden 使用率):每次 Young GC 后应大幅下降;若下降幅度越来越小,说明有大量对象在 Eden 区“赖着不走”
  • OU(老年代使用率):最危险的指标——如果它随时间单向爬升,Full GC 后也只回落一点点,基本可断定存在泄漏

注意:jstat 不需要 dump 堆,零侵入、秒级响应,是线上第一道筛查关卡。别一上来就跑 jmap -dump,那会暂停应用几秒到几十秒,尤其大堆时风险极高。

为什么 jmap -histo:live 比 dump 更适合初筛?

jmap -histo:live <pid></pid> 输出的是当前存活对象的类统计,轻量、快速、不暂停 JVM(仅短暂 STW),比生成几个 GB 的 heap.hprof 文件实用得多。

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

重点关注三列:#instances(实例数)、bytes(总字节数)、class name(类名)。常见泄漏信号包括:

  • 某个自定义类(如 com.example.UserData)实例数达数十万甚至百万,远超业务合理范围
  • byte[]char[] 占比异常高,可能对应未关闭的流、未释放的缓存或 Base64 解码残留
  • 大量 java.util.HashMap$Nodejava.util.ArrayList,暗示集合类在无节制膨胀

⚠️ 坑点:jmap -histo 默认不加 :live 会统计所有对象(含待回收的),结果失真;务必写全 :live

Vondy
Vondy

下一代AI应用平台,汇集了一流的工具/应用程序

下载

用 MAT 分析 dump 文件时,别只看“Leak Suspects Report”

MAT 自动生成的泄漏嫌疑报告(Leak Suspects Report)确实方便,但它依赖启发式规则,容易漏掉隐式引用链,比如:

  • 静态内部类持有了外部 Activity/Service 实例(Android 场景)
  • ThreadLocal 变量在线程池中长期存活,其 value 引用的对象无法释放
  • 监听器注册后未注销,而监听器是匿名内部类,隐式持有外部类强引用

更可靠的做法是手动查 Dominator Tree → 找到占用内存最大的对象 → 右键 Path to GC Roots → 勾选 exclude weak/soft references(弱/软引用通常可忽略)→ 逐层展开,直到看到你代码里的类名和字段名。真正泄漏点,往往藏在第三、第四层引用上。

Arthas 的 trace 和 watch 能定位泄漏源头吗?

能,而且非常快。Arthas 不分析内存快照,而是动态追踪对象创建与引用路径。例如:

  • watch com.example.CacheService addToCache returnObj 监控缓存添加行为,确认是否无条件追加
  • trace com.example.DataProcessor process -n 5 查看方法调用链和耗时,发现某次调用中意外 new 了大量对象
  • 结合 ognl '@java.lang.Runtime@getRuntime().totalMemory()' 实时读内存总量,交叉验证

优势在于:无需重启、无需 dump、可在线上灰度环境直接验证假设。但要注意,watchtrace 有性能开销,高频方法慎用,建议先用 jstat 锁定可疑时间段再精准介入。

真正的难点从来不是工具不会用,而是泄漏常常发生在你“觉得没问题”的地方:一个被复用的线程池里没清理 ThreadLocal,一个泛型擦除后丢失类型检查的 static Map,甚至是一个日志框架里被误设为 DEBUG 级别后疯狂打印对象 toString() 导致临时对象暴增。越隐蔽的地方,越要靠 Path to GC Roots 一层层剥,而不是靠经验猜。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
堆和栈的区别
堆和栈的区别

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

447

2023.07.18

堆和栈区别
堆和栈区别

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

606

2023.08.10

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

891

2024.01.03

python中class的含义
python中class的含义

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

32

2025.12.06

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

39

2026.03.13

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

766

2023.08.10

golang map内存释放
golang map内存释放

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

77

2025.09.05

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

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

40

2025.11.16

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

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

精品课程

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

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.3万人学习

Java 教程
Java 教程

共578课时 | 81.5万人学习

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

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