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

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

秋芳酱_9128

秋芳酱_9128

发布时间:2026-04-13 14:21:17

|

496人浏览过

|

来源于php中文网

原创

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

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

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

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

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

  • 用 jmap -histo:live <pid> 查看存活对象数量和大小,重点关注自定义类和大数组
  • 用 jmap -dump:format=b,file=heap.hprof <pid> 生成堆转储,用 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)、或应用热部署次数过多,都可能导致元空间耗尽。

  • 监控元空间使用:用 jstat -gc <pid> 查看 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 <pid> | wc -l,对比 ulimit -u;优化线程模型,改用线程池而非每请求新建线程
  • 调小单线程栈:-Xss256k(默认 1M),尤其在高并发、大量线程场景下能显著提升可创建线程数
  • 栈溢出重点查递归逻辑、正则回溯、AOP 过度嵌套等,用 -XX:+PrintGCDetails 和线程 dump(jstack <pid>)交叉分析

热门AI工具

更多
火山引擎

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

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

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

切问学术

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

WorkBuddy

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

AionClaw
AionClaw Hot

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

Laper
Laper Hot

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

DeepSeek

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

豆包大模型

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

相关专题

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

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

2291

2025.08.06

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

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

437

2026.01.26

eclipse教程
eclipse教程

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

570

2023.06.14

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

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

4786

2023.07.24

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

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

7299

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

2784

2024.02.23

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

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

622

2024.02.23

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

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

3066

2025.10.10

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

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

精品课程

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

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