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

Java里内存溢出和内存泄漏区别_Java内存问题对比说明

阿枫姑娘_6595

阿枫姑娘_6595

发布时间:2026-01-01 10:35:02

|

647人浏览过

|

来源于php中文网

原创

内存溢出是当场崩溃,内存泄漏是慢性失血;溢出立即抛OutOfMemoryError并中断线程,泄漏则无报错但老年代内存持续缓慢上升直至最终溢出。

java里内存溢出和内存泄漏区别_java内存问题对比说明

内存溢出(OutOfMemoryError)是“当场崩溃”,内存泄漏(Memory Leak)是“慢性失血”

内存溢出是你申请 10MB,JVM 告诉你:“堆只剩 2MB,不给,java.lang.OutOfMemoryError: Java heap space”。它立刻抛异常、中断线程、可能整服务挂掉。而内存泄漏根本不会报错——对象明明没用了,却还被 static Map、未注销的监听器、未关闭的 InputStream 死死拽着,GC 回收不了,内存占用一天天涨,直到某次 Full GC 后仍无法腾出空间,才触发溢出。

怎么一眼区分是泄漏还是溢出?看日志和增长趋势

OOM 错误日志里一定带明确的 OutOfMemoryError 和具体区域(如 Metaspace、Direct buffer memory),且往往发生在某个操作之后(比如导出大报表、批量上传)。而内存泄漏的典型信号是:jstat -gc 显示老年代(OU)使用率持续缓慢上升,每次 GC 后回收量越来越少;jmap -histo 发现某个类实例数暴涨(比如 com.example.UserCacheEntry 十万+);或者 VisualVM 中堆内存曲线呈阶梯式爬升,中间没有明显回落。

  • 溢出常伴随单次大动作:如 new byte[200 * 1024 * 1024] 直接申请 200MB
  • 泄漏常藏在“合理逻辑”里:比如 Spring Bean 中用 static ConcurrentHashMap 缓存用户会话,但忘了加过期或清理机制
  • 别信“重启后好了”——如果一周后又 OOM,八成是泄漏在悄悄堆积

定位泄漏最有效的三步实操

别一上来就啃 MAT(Memory Analyzer Tool)堆转储文件。先做轻量级排查:

  • 用 jconsole 或 VisualVM 连上运行中的进程,打开“Classes”页签,按实例数排序,重点关注你项目里的类(不是 java.* 或 sun.*)
  • 执行一次手动 GC(VisualVM 的“Perform GC”按钮),再观察老年代(Old Gen)内存是否回落——如果不降,说明有对象被强引用卡住,大概率是泄漏点
  • 抓一个堆转储:jmap -dump:format=b,file=heap.hprof <pid>,用 MAT 打开后点 “Leak Suspects Report”,它会自动标出疑似泄漏链,重点看 “Path to GC Roots” 是否包含不该存在的静态引用或线程局部变量

常见坑:MAT 默认只显示“强引用”路径,但有时泄漏由 ThreadLocal 引起——得手动切换到 “Weak References” 或 “Soft References” 查看;还有些框架(如某些 RPC 客户端)会把回调注册进全局监听器池,不显式 remove 就永远不释放。

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

JVM 参数和代码习惯才是防泄漏的真正防线

调大 -Xmx 只是把 OOM 推迟,治标不治本。真正管用的是从编码和配置双管齐下:

  • 集合类优先用带过期策略的:Caffeine.newBuilder().maximumSize(1000).expireAfterWrite(10, TimeUnit.MINUTES),而不是裸写 static Map<K,V>
  • 所有实现了 AutoCloseable 的资源(InputStream、Connection、Statement)必须用 try-with-resources,哪怕只是临时读个配置文件
  • 监听器注册后,务必在生命周期结束时反向注销,比如 Activity 的 onDestroy()、Spring Bean 的 @PreDestroy 方法里调用 eventBus.unregister(this)
  • 避免在 ThreadLocal 中存大对象,用完必须 remove()——尤其 Web 容器中线程复用,不 remove 会导致前一个请求的数据污染下一个

最易被忽略的一点:第三方 SDK 的内存行为。比如旧版 FastJSON 在反序列化时若开启 Feature.SupportNonPublicField,可能因反射缓存导致元空间泄漏;又比如某些日志框架的 MDC(Mapped Diagnostic Context)在线程池中未清理,会随线程复用越积越多。上线前务必跑一轮压测 + 内存监控,别等凌晨报警才翻文档。

热门AI工具

更多
PixPix
PixPix Hot

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

Seko
Seko Hot

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

咔片AIPPT

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

DeepSeek

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

PixTV
PixTV Hot

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

WorkBuddy

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

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

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

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

相关专题

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

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

2651

2025.08.06

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

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

477

2026.01.26

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1749

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1211

2024.06.27

堆和栈的区别
堆和栈的区别

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

5987

2023.07.18

堆和栈区别
堆和栈区别

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

2548

2023.08.10

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

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

4298

2023.08.10

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

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

610

2025.09.05

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

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

精品课程

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