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

Java内存泄漏与对象清理处理方法

老敏姑娘_9537

老敏姑娘_9537

发布时间:2026-01-06 16:13:03

|

911人浏览过

|

来源于php中文网

原创

Java内存泄漏四大高发场景是静态集合类、未关闭资源、内部类持有外部类引用、ThreadLocal;典型表现有堆内存持续上升、Full GC无效、频繁OOM;可用jmap+jhat定位,优先用jmap -histo快速采样;WeakReference适用于防泄漏临时绑定,SoftReference适合可重建缓存;Spring Bean需显式清理资源,不能依赖GC或@PreDestroy。

java内存泄漏与对象清理处理方法

Java中哪些对象最容易引发内存泄漏

静态集合类、未关闭的资源、内部类持有外部类引用、线程本地变量(ThreadLocal)是四大高发场景。比如把 ArrayList 声明为 static 并持续 add(),只要类不卸载,这个列表及其所有元素就永远无法被 GC 回收。

常见错误现象包括:堆内存使用量随时间持续上升、Full GC 频次增加但老年代回收效果差、OutOfMemoryError: Java heap space 反复出现且 dump 后发现大量业务对象堆积。

  • static Map<String, Object> 缓存未设上限或未清理过期项
  • 数据库连接、文件流、网络 socket 使用后未在 finally 或 try-with-resources 中显式关闭
  • 非静态内部类(如监听器、Runnable)被线程池长期持有,间接持有了外部 Activity/Service 实例(Android)或 Spring Bean
  • ThreadLocal<List> 在线程复用场景(如 Tomcat 线程池)中未调用 remove(),导致旧请求数据残留

如何用 jmap + jhat 快速定位泄漏对象

不要等 OOM 才排查。先用 jps -l 查到目标进程 PID,再执行:

jmap -dump:format=b,file=heap.hprof <pid>

生成的 heap.hprof 可用 jhat 启动分析服务:

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

jhat -port 7000 heap.hprof

然后浏览器打开 http://localhost:7000,重点看:References to the selected object 和 Heap histogram。如果发现某个业务类实例数异常多(比如 com.example.UserContext 占比超 40%),点进去看它的 GC Roots 路径——通常能直接看到是哪个静态字段或线程栈在强引用它。

注意:jmap -histo 更轻量,适合线上快速采样:

Alibabacloud Sdk Client Initialization For Java
Alibabacloud Sdk Client Initialization For Java

在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。

下载
jmap -histo <pid> | head -20

重点关注 instances 列数值突增的类,尤其是你自己写的类。

WeakReference 和 SoftReference 的实际选用边界

不是所有缓存都适合用 WeakReference。它的回收时机由 GC 决定,且一旦被回收就不可恢复;而 SoftReference 会在内存不足时才回收,更适合做内存敏感型缓存。

  • 用 WeakReference:临时上下文绑定(如将 Activity 引用传给异步任务时防内存泄漏)、监听器解注册辅助
  • 用 SoftReference:图片缓存、模板解析结果缓存等可重建但代价较高的对象
  • 不用 Reference 子类:数据库连接、文件句柄、锁对象——这些必须显式释放,不能依赖 GC

示例:防止 Handler 持有 Activity 泄漏

static class SafeHandler extends Handler {
    private final WeakReference<Activity> mActivity;
    SafeHandler(Activity activity) {
        mActivity = new WeakReference<>(activity);
    }
    @Override
    public void handleMessage(Message msg) {
        Activity activity = mActivity.get();
        if (activity != null && !activity.isFinishing()) {
            // 安全使用
        }
    }
}

Spring Bean 生命周期中容易忽略的清理点

Spring 管理的单例 Bean 默认不会销毁,但其中持有的资源(如定时任务、监听器、线程池)必须手动清理。靠 @PreDestroy 不够,因为容器异常关闭时该方法可能不执行。

  • 实现 DisposableBean 接口并重写 destroy(),比 @PreDestroy 更可靠(Spring 会保证调用)
  • 对 ScheduledExecutorService,必须调用 shutdownNow() 并 awaitTermination(),否则 JVM 无法退出
  • 使用 ApplicationRunner 或 CommandLineRunner 注册 JVM 关闭钩子(Runtime.getRuntime().addShutdownHook())作为兜底

特别注意:Spring Boot Actuator 的 /actuator/shutdown 端点默认关闭,启用后也只触发容器关闭流程,不替代显式资源释放逻辑。

GC 不会帮你关数据库连接,也不会替你注销事件监听器。最可靠的清理永远发生在代码明确执行的那一刻,而不是等待某个“自动”机制。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

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

DeepSeek

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

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

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

咔片AIPPT

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

音述AI
音述AI Hot

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

相关专题

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

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

645

2023.10.26

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

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

284

2024.02.23

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

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

469

2024.02.23

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

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

265

2024.02.23

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

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

328

2024.02.23

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

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

329

2024.02.23

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

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

541

2024.02.23

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

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

302

2024.02.23

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

120

2026.09.23

热门下载

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

精品课程

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