讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

Laper
Laper

剧本策划到成片协作

剧云
剧云

中文短剧剧本制作平台

AniShort
AniShort

AI短剧协同制作平台

Java内存泄漏怎么排查 Java OOM异常解决办法【教程】

雨婷吖_3851

雨婷吖_3851

发布时间:2025-12-30 05:07:09

|

249人浏览过

|

来源于php中文网

原创

Java内存泄漏和OOM本质是堆内存被无用对象长期占用且无法GC回收,排查需按“抓快照→看分布→找引用链→定位代码”四步进行,并关注Metaspace、直接内存、线程数等非堆OOM场景。

java内存泄漏怎么排查 java oom异常解决办法【教程】

Java内存泄漏和OOM(OutOfMemoryError)本质是堆内存长期被无用对象占用,无法被GC回收,最终导致内存耗尽。排查核心思路是:抓快照 → 看对象分布 → 找强引用链 → 定位代码源头。

一、快速确认是否真有内存泄漏

别一上来就看堆转储。先观察运行时表现:

  • JVM启动加 -XX:+PrintGCDetails -Xloggc:gc.log,看Full GC是否频繁且每次回收后老年代内存不下降
  • 用 jstat -gc 持续监控,重点关注 OGCMN/OGCMX(老年代初始/最大值)、OGC(当前老年代使用量)、OC(老年代容量) —— 若OGC持续逼近OC且不回落,大概率泄漏
  • 用 jmap -histo:live 对比两次结果,看某些对象实例数是否只增不减(如HashMap、ArrayList、自定义DTO、监听器等)

二、生成并分析堆转储(Heap Dump)

确认异常后,立即导出堆快照(避免二次GC干扰):

  • jmap -dump:format=b,file=heap.hprof (生产环境慎用,会暂停应用;可加 -F 强制,但可能不完整)
  • 更推荐在JVM启动时加参数自动触发:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps/
  • 用 Eclipse MAT(Memory Analyzer Tool) 打开hprof文件,点 “Leak Suspects Report” —— 它会自动标出最可能泄漏的几个对象组及支配树(Retained Heap占比高、GC Roots强引用链长的对象优先看)

三、常见泄漏场景与修复方式

不必盲目猜,90%问题集中在以下几类:

Expanso yaml-to-json
Expanso yaml-to-json

使用 Expanso Edge 管道将 YAML 输入转换为 JSON 格式。

下载

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

  • 静态集合类持有对象:如 public static Map cache = new HashMap(); 忘记清理或没设过期策略 → 改用 WeakHashMap / Caffeine / 加定时清理线程
  • 内部类/匿名类隐式持外部类引用:非静态内部类会持外部this;若该内部类被线程池、监听器等长期引用,外部类也泄漏 → 改为静态内部类 + 显式传参,或用WeakReference包装外部引用
  • 未关闭资源导致关联对象驻留:InputStream、Connection、ThreadLocal、ScheduledExecutorService中的Runnable → 确保finally块中close() / remove() / shutdown()
  • 第三方库不当使用:如Netty的ByteBuf未release()、OkHttp的Call未cancel()、Spring中@EventListener未加@Async却处理耗时逻辑 → 查文档,严格遵循生命周期管理

四、OOM不是只有堆内存问题

别只盯着-heap。其他常见OOM类型和对策:

  • java.lang.OutOfMemoryError: Metaspace → 类加载过多(热部署、动态字节码生成),加 -XX:MaxMetaspaceSize=256m 并检查是否重复加载类
  • java.lang.OutOfMemoryError: Direct buffer memory → NIO直接内存超限,加 -XX:MaxDirectMemorySize=512m,并确保ByteBuffer.allocateDirect()后调用cleaner或手动clean()
  • java.lang.OutOfMemoryError: unable to create new native thread → 线程数超系统限制,检查是否无限创建Thread、线程池配置不合理、或ulimit -u太小

基本上就这些。关键是养成习惯:上线前加基础JVM监控参数,压测时关注GC日志和内存趋势,出问题时不靠“重启解决”,而是保留现场再分析。工具只是辅助,真正要盯住的是对象之间的引用关系——谁在死死拽着不该活的对象不放。

热门AI工具

更多
豆包大模型

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

音述AI
音述AI Hot

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

DeepSeek

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

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Atoms
Atoms Hot

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

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

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

相关专题

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

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

2951

2025.08.06

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

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

517

2026.01.26

eclipse教程
eclipse教程

php中文网为大家带来eclipse教程合集,eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。php中文网还为大家带来eclipse的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

730

2023.06.14

eclipse怎么设置中文
eclipse怎么设置中文

eclipse设置中文的方法:除了设置界面为中文外,你还可以为Eclipse添加中文插件,以便更好地支持中文编程。例如,你可以安装EBNF插件来支持中文变量名,或安装Chinese Helper来提供中文帮助文档。本专题为大家提供eclipse设置中文相关的各种文章、以及下载和课程。

6286

2023.07.24

c语言编程软件有哪些
c语言编程软件有哪些

c语言编程软件有GCC、Clang、Microsoft Visual Studio、Eclipse、NetBeans、Dev-C++、Code::Blocks、KDevelop、Sublime Text和Atom。更多关于c语言编程软件的问题详情请看本专题的文章。php中文网欢迎大家前来学习。

9839

2023.11.02

Eclipse版本号有哪些区别
Eclipse版本号有哪些区别

区别:1、Eclipse 3.x系列:Eclipse的早期版本,包括3.0、3.1、3.2等;2、Eclipse 4.x系列:Eclipse的最新版本,包括4.0、4.1、4.2等;3、Eclipse IDE for Java Developers等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2804

2024.02.23

eclipse和idea有什么区别
eclipse和idea有什么区别

eclipse和idea的区别:1、平台支持;2、内存占用;3、插件系统;4、智能代码提示;5、界面设计;6、调试功能;7、学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

662

2024.02.23

eclipse设置中文全教程
eclipse设置中文全教程

本专题整合了eclipse设置中文相关教程,阅读专题下面的文章了解更多详细操作。

4066

2025.10.10

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

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

0

2026.11.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

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