讲师中心 微信公众号
AI工具推荐 视频效率加速

Java内存泄漏与垃圾回收的核心问题

冬杰大大_2638

冬杰大大_2638

发布时间:2026-01-21 13:05:55

|

734人浏览过

|

来源于php中文网

原创

Java中易致内存泄漏的引用类型包括强引用(未置null或超作用域)、弱引用误用(如WeakHashMap中key未重写equals/hashCode)、静态集合滥用、内部类隐式引用、ThreadLocal未remove等。

java内存泄漏与垃圾回收的核心问题

Java中哪些引用类型会导致内存泄漏

强引用(Object obj = new Object())最常见,只要它没被显式置为 null 或超出作用域,GC 就不会回收对应对象。但真正容易埋雷的是弱引用误用和静态集合滥用。

比如把 WeakHashMap 当成“自动清理缓存”用,却往 key 里塞了非重写 equals()/hashCode() 的自定义对象——WeakHashMap 内部仍用 == 判断 key 是否被回收,结果 key 被回收后,value 却因引用链残留而无法释放。

  • static List<object> cache = new ArrayList()</object> 是高频泄漏源:只要类没卸载,这个列表及其所有元素就永远存活
  • 内部类持有外部类隐式引用,若该内部类被线程池或监听器长期持有(如 new Thread(new Runnable() { ... })),整个外部实例也跟着泄漏
  • 使用 ThreadLocal 后未调用 remove():在线程复用场景(如 Tomcat 线程池)下,value 会随线程生命周期滞留,且 key 是弱引用,可能提前被清,留下“脏 entry”

如何定位真实的内存泄漏点而非 GC 假象

频繁 Full GC 不等于内存泄漏,可能是堆太小、分配速率过高,或只是老年代碎片化。关键看 java.lang.OutOfMemoryError: Java heap space 是否伴随 GC overhead limit exceeded 或堆使用率持续攀高不回落。

推荐组合排查路径:

jm-jsjkxyjs02-zlm-405
jm-jsjkxyjs02-zlm-405

使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。

下载

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

  • 启动时加 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump.hprof,OOM 后直接分析快照
  • 用 jstat -gc <pid></pid> 观察 OU(老年代使用量)是否单向增长,同时 OC(老年代容量)不变;若 OU 长期 >90% 且每次 GC 后仅下降少量,大概率泄漏
  • 避免只看 jmap -histo:它只统计类实例数,看不出谁在持有着些实例;要用 jhat 或 VisualVM 打开 hprof,按“Paths from GC Roots”查强引用链

System.gc() 和 finalize() 对泄漏诊断的实际干扰

显式调用 System.gc() 会打乱 JVM 的 GC 节奏,掩盖真实分配压力;而重写 finalize() 更危险——它会让对象从“可回收”变成“待终结”,进入 Finalizer 队列,延迟至少一个 GC 周期才能真正回收,还可能因 finalize() 执行慢或抛异常导致队列积压,最终引发 java.lang.OutOfMemoryError: GC Overhead Limit Exceeded。

现代 JDK(9+)已弃用 finalize(),应改用 Cleaner 或 PhantomReference + 引用队列手动管理资源清理。

  • 不要在 finalize() 中重新建立强引用(如 this.someField = new Object()),这会让对象“复活”,彻底绕过 GC
  • System.gc() 在生产环境应禁用;若用于测试,需配合 -XX:+DisableExplicitGC 验证其无效性
  • Cleaner 不依赖 GC 触发时机,而是由 JVM 在对象不可达后异步调度,更可控

G1 GC 下容易被忽略的泄漏诱因

G1 默认启用 -XX:+UseStringDeduplication,对重复字符串做去重,但该功能依赖 String 的 char[] 引用关系。若代码大量使用 substring()(JDK 7u6 以前)或 new String(byte[], ...) 构造出共享底层数组的字符串,去重逻辑可能意外延长原始大数组的生命周期。

  • JDK 8u20+ 中 String.substring() 已不再共享数组,但手动用 Arrays.copyOfRange() 复制字符数组再构造 String 仍可能引发类似问题
  • G1 的混合 GC(Mixed GC)只回收部分 Region,若泄漏对象分散在多个 Region 中,可能连续几次混合 GC 都没覆盖到,造成“泄漏节奏慢于 GC 节奏”的假象
  • 开启 -XX:+PrintGCDetails 后注意 Humongous Allocation 日志:大对象(>50% Region size)直接进 Humongous 区,不参与常规回收;若频繁分配大数组或大集合,又没及时清理,极易撑爆老年代
实际排查时,最常卡在“看到对象没被回收,就认定是泄漏”,却忽略了 ClassLoader 持有、JNI 全局引用、或 native 内存(如 ByteBuffer.allocateDirect())这些非堆区域的问题。堆外内存泄漏不会体现在 hprof 里,得靠 pmap -x <pid></pid> 或 Native Memory Tracking(-XX:NativeMemoryTracking=detail)来确认。

热门AI工具

更多
DeepSeek

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

UpDream
UpDream Hot

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

WorkBuddy

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

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

花生AI
花生AI Hot

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

豆包大模型

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

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

905

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

324

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

509

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

305

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

348

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

349

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

601

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

322

2024.02.23

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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