内存溢出OutOfMemoryError不同场景成因及解决方法

秋芳酱_9128

秋芳酱_9128

2026-04-13

496人浏览

原创

内存溢出需按区域精准定位:堆溢出查对象泄漏与gc,元空间溢出查动态类生成与classloader,直接内存溢出查bytebuffer未释放与系统限制,gc开销过大或栈溢出则分别排查堆压与线程配置。

内存溢出outofmemoryerror不同场景成因及解决方法

内存溢出(OutOfMemoryError)不是单一问题,而是 JVM 在不同内存区域无法分配所需内存时抛出的异常。关键要区分是哪块内存“爆了”——堆、元空间、直接内存、线程栈,还是 GC 本身卡住了。定位不准,加内存或调参数往往白忙。

堆内存溢出(java.lang.OutOfMemoryError: Java heap space)

最常见,表现为对象创建过多、生命周期过长,或存在内存泄漏(如静态集合不断 add、缓存未清理、监听器未反注册)。JVM 尝试 GC 后仍无法腾出足够空间,就会报这个错。

  • 用 jmap -histo:live 查看存活对象数量和大小,重点关注自定义类和大数组
  • 用 jmap -dump:format=b,file=heap.hprof 生成堆转储,用 VisualVM 或 Eclipse MAT 分析谁占了最多内存、是否有可疑的强引用链
  • 检查代码中是否误用 static Map/Cache/List 缓存业务对象;确认第三方 SDK(如某些 ORM、RPC 框架)是否有已知内存泄漏 issue
  • 合理设置堆参数:避免 -Xms 和 -Xmx 差距过大,建议设为相同值以减少动态扩容开销;新生代比例(-XX:NewRatio)按对象朝生夕死特征调整

元空间溢出(java.lang.OutOfMemoryError: Metaspace)

JDK 8+ 用元空间替代永久代,存放类元数据(类名、字段、方法、常量池等)。频繁动态生成类(如大量使用 CGLIB、Javassist、Spring AOP 代理、Groovy 脚本、OSGi)、或应用热部署次数过多,都可能导致元空间耗尽。

Whimsical
Whimsical

Whimsical是一款用于生成和协作编辑思维导图、流程图、线框图等视觉内容的 AI 协作工具。

下载
  • 监控元空间使用:用 jstat -gc 查看 MU(Metaspace Used)和 MC(Metaspace Capacity)
  • 限制上限并预留余量:-XX:MaxMetaspaceSize=256m(不设可能吃光系统内存),同时可设 -XX:MetaspaceSize=128m 触发更早 GC
  • 排查类加载器泄漏:多个 ClassLoader 加载同一类的不同版本且未被回收,MAT 中可按 “ClassLoader” 分组查看 loaded class 数量
  • 减少不必要的字节码增强,评估是否可用 JDK 动态代理替代 CGLIB(后者会生成更多子类)

直接内存溢出(java.lang.OutOfMemoryError: Direct buffer memory)

使用 ByteBuffer.allocateDirect() 分配的堆外内存不受 JVM 堆参数控制,但受 -XX:MaxDirectMemorySize 限制(默认等于 -Xmx)。Netty、NIO 文件通道、部分数据库驱动(如 PostgreSQL 的 pgjdbc)大量使用直接内存,若申请后未显式 clean() 或依赖 System.gc() 回收,容易堆积。

  • 启用直接内存跟踪:-XX:+PrintGCDetails -XX:+PrintGCTimeStamps 并观察日志中 DirectMemory 相关统计
  • 明确设置上限:-XX:MaxDirectMemorySize=512m,避免默认值引发意外 OOM
  • 检查 Netty 等框架是否配置了合理的 maxDirectMemory 或 -Dio.netty.maxDirectMemory;确认 ByteBuffer 使用后调用 cleaner.clean()(或让其自然被 GC)
  • 注意 Linux 系统级限制:ulimit -l 控制 mlock 内存上限,过低会影响 direct buffer 分配

GC 开销过大或线程栈溢出

两类易混淆场景:
• java.lang.OutOfMemoryError: GC overhead limit exceeded:GC 花费超 98% 时间却只回收不到 2% 内存,说明堆几乎填满且对象难以释放,本质仍是堆泄漏或容量不足。
• java.lang.StackOverflowError 或 java.lang.OutOfMemoryError: unable to create new native thread:前者是单线程递归/循环调用太深;后者是 JVM 创建线程失败,通常因系统级线程数达上限(ulimit -u),或每个线程栈太大(-Xss 设过高)导致总内存超限。

  • 遇到 GC overhead,先按堆溢出流程 dump 分析;临时可加 -XX:-UseGCOverheadLimit 屏蔽该检查(仅用于诊断,勿上线)
  • 查系统线程数:ps -T -p | wc -l,对比 ulimit -u;优化线程模型,改用线程池而非每请求新建线程
  • 调小单线程栈:-Xss256k(默认 1M),尤其在高并发、大量线程场景下能显著提升可创建线程数
  • 栈溢出重点查递归逻辑、正则回溯、AOP 过度嵌套等,用 -XX:+PrintGCDetails 和线程 dump(jstack )交叉分析

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2025.08.06

2251

22

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

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

2026.01.26

437

25

eclipse教程
eclipse教程

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

2023.06.14

570

5

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

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

2023.07.24

4766

6

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

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

2023.11.02

7259

18

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等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

2784

5

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

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

2024.02.23

622

5

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

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

2025.10.10

3046

11

eclipse字体放大教程
eclipse字体放大教程

本专题整合了eclipse字体放大教程,阅读专题下面的文章了解更多详细内容。

2025.10.10

3085

12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
传智播客JQuery编程视频教程
传智播客JQuery编程视频教程

共36课时 | 8.1万人学习

韩顺平Jquery视频教程
韩顺平Jquery视频教程

共15课时 | 4.2万人学习