当前位置: 首页 > article >正文

Java OOM 异常:从原理、场景、排查到解决方案全攻略

原理 → 场景 → 排查 → 解决方案面试 线上实战必备这是后端开发、测试、运维必须烂熟于心的终极 OOM 指南结构清晰、可直接用于复习、面试、故障处理。一、OOM 基础到底什么是 OOM1. 定义OOM OutOfMemoryErrorJVM 内存耗尽无法再分配新的内存空间且无法通过 GC 回收足够内存JVM 抛出致命错误。2. 本质原因内存真的不够数据量太大、堆太小内存泄漏对象不用了但 GC 无法回收资源未释放连接、流、缓存未关闭创建对象速度 GC 回收速度3. OOM 不是 Exception是 ErrorException可捕获、可恢复ErrorJVM 严重问题无法恢复二、OOM 6 大经典场景99% 线上故障都在这里1. Java Heap Space最常见plaintextjava.lang.OutOfMemoryError: Java heap space原因一次性加载太多数据如全表查询死循环创建对象集合对象只增不减缓存、List 无限增长内存泄漏典型代码java运行ListObject list new ArrayList(); while(true) list.add(new Object()); // 无限加2. Metaspace / PermGen 溢出plaintextjava.lang.OutOfMemoryError: Metaspace原因动态生成大量类CGLib、MyBatis、Groovy大量 JSP 编译成 Servlet反射 / 代理过多Metaspace 大小设置太小3. 栈溢出 StackOverflowErrorplaintextjava.lang.StackOverflowError原因递归死循环方法调用深度太深4. 直接内存溢出 Direct Buffer MemoryplaintextOutOfMemoryError: Direct buffer memory原因NIO 框架Netty使用堆外内存未释放直接缓冲区MaxDirectMemorySize 设置过小5. GC 开销过大plaintextjava.lang.OutOfMemoryError: GC overhead limit exceeded原因GC 回收效率极低98% 时间在 GC只回收 2% 内存JVM 保护性抛出异常6. 创建线程过多plaintextjava.lang.OutOfMemoryError: unable to create new native thread原因线程无限创建无池化OS 线程数上限被打满三、OOM 核心原理内存泄漏 vs 内存溢出1. 内存溢出OOM内存真的不够用了对象太多堆装不下。2. 内存泄漏Memory Leak对象不用了但 GC 无法回收越来越多垃圾堆积 → 最终 OOM3. 内存泄漏 7 大真凶静态集合static List/Map未关闭资源IO、Socket、Connection内部类持有外部类引用ThreadLocal 未 remove缓存未过期、未清理监听器未注销单例对象持有外部引用四、OOM 排查标准流程企业级实战第一步确认 OOM 类型看日志第一行Java heap space→ 堆溢出Metaspace→ 元空间溢出unable to create thread→ 线程过多第二步开启 JVM 自动 Dump必须配置plaintext-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/tmp/heap.hprofOOM 时自动导出堆快照不丢现场。第三步分析工具1. 命令行工具jps定位进程jstat -gc 12345看 GC 情况jmap手动 Dumpjstack看线程2. 可视化分析神器MATEclipse Memory Analyzer→ 最强Arthas→ 阿里开源线上实时诊断VisualVMJProfiler第四步MAT 快速定位泄漏打开.hprof文件点Leak Suspects看Problem Suspect定位到具体类、集合、对象查看 GC Roots 找到谁在引用第五步定位代码 → 修复五、OOM 标准解决方案通用万能方案1. 代码层治本避免死循环创建对象集合使用后清空 / 限制大小使用连接池DB、HTTP、Redis流、连接用完必须关闭ThreadLocal 必须remove()大集合分页处理缓存加过期、淘汰策略2. JVM 参数层治标plaintext# 堆内存 -Xms4g -Xmx4g # 元空间 -XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m # OOM自动dump -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/tmp/ # GC日志 -Xloggc:gc.log -XX:PrintGCDetails3. 架构层异步 限流分片、分页分布式缓存Redis服务拆分六、高频 OOM 场景 解决方案速查表表格OOM 类型典型原因最快解决方案Heap Space全表查询、死循环、内存泄漏分页、修复泄漏、加大 -XmxMetaspace大量动态类加大元空间、升级 ASM、检查 CGLibStackOverflow递归死循环修复递归、限制深度DirectBufferNIO 堆外内存未释放检查 Netty 配置增加 MaxDirectMemorySizeGC overhead内存快耗尽查泄漏、加大堆Unable to create thread无限制创建线程使用线程池、限制最大线程数七、面试必问 10 题标准答案1. OOM 是什么内存不足JVM 无法分配新对象。2. OOM 发生在哪些区域堆、元空间、栈、直接内存、线程栈。3. 内存泄漏和溢出的区别泄漏是占着不用溢出是真不够用。4. 哪些情况会导致内存泄漏静态集合、ThreadLocal、未关闭资源、内部类引用。5. 如何预防 OOM分页、池化、用完释放、加过期、限制集合大小。6. 线上 OOM 如何排查开启 Dump → MAT 分析 → 找 GC Roots → 定位代码。7. 最常见 OOMJava heap space。8. 如何让程序 OOM死循环往 List 加对象。9. 如何获取堆快照jmap 或 JVM 参数自动 Dump。10. 如何解决 OOM先代码修复泄漏再调整 JVM 参数。八、终极总结最强记忆版OOM 内存耗尽90% 是堆溢出80% 源于内存泄漏排查靠Dump MAT解决靠代码修复 JVM 参数线上必须加自动 Dump核心避免无限创建对象 用完及时释放

相关文章:

Java OOM 异常:从原理、场景、排查到解决方案全攻略

原理 → 场景 → 排查 → 解决方案(面试 线上实战必备)这是后端开发、测试、运维必须烂熟于心的终极 OOM 指南,结构清晰、可直接用于复习、面试、故障处理。一、OOM 基础:到底什么是 OOM?1. 定义OOM OutOfMemoryErro…...

EasyMQTT嵌入式MQTT轻量封装原理与实战

1. EasyMQTT 库深度解析:面向嵌入式工程师的 MQTT 轻量级封装实践EasyMQTT 并非一个通用型 MQTT 客户端抽象层,而是一个高度场景化、面向特定 IoT 生态闭环设计的固件级通信中间件。其核心价值不在于协议栈功能的完备性,而在于将 ESP32/ESP82…...

如何用Downr1n实现iOS设备有线降级:从原理到实践的分步指南

如何用Downr1n实现iOS设备有线降级:从原理到实践的分步指南 【免费下载链接】downr1n downgrade tethered checkm8 idevices ios 14, 15. 项目地址: https://gitcode.com/gh_mirrors/do/downr1n 面对iOS系统升级后的性能下降和兼容性问题,许多iPh…...

避坑指南:在Ubuntu 20.04上搞定VINS-Fusion依赖(Ceres、Eigen、gflags报错全解决)

深度解析:Ubuntu 20.04部署VINS-Fusion的依赖陷阱与系统级解决方案 在机器人视觉与SLAM领域,VINS-Fusion作为香港科技大学开源的多传感器融合框架,已成为学术界和工业界的重要参考实现。然而当开发者满怀期待地克隆代码准备体验其强大功能时&…...

告别SVN烦恼:三步完成SVN到Git的无缝迁移

告别SVN烦恼:三步完成SVN到Git的无缝迁移 【免费下载链接】svn2git 项目地址: https://gitcode.com/gh_mirrors/sv/svn2git 在软件开发的版本控制领域,Subversion(SVN)曾是许多团队的首选工具。然而,随着分布式…...

大模型Prompt实战指南:从基础到高阶的提问艺术

1. 为什么Prompt提问技巧如此重要? 第一次用ChatGPT时,我直接问"怎么写工作总结",结果得到一篇泛泛而谈的模板。后来学会在问题里加上"我是一名互联网产品经理,需要向CTO汇报季度工作",回答立刻精…...

终极解决:Compose Multiplatform 跨平台应用字体配置全流程指南

终极解决:Compose Multiplatform 跨平台应用字体配置全流程指南 【免费下载链接】compose-multiplatform JetBrains/compose-multiplatform: 是 JetBrains 开发的一个跨平台的 UI 工具库,基于 Kotlin 编写,可以用于开发跨平台的 Android&…...

探索跨平台动态壁纸的技术突破:Lively Wallpaper的多系统适配之路

探索跨平台动态壁纸的技术突破:Lively Wallpaper的多系统适配之路 【免费下载链接】lively Free and open-source software that allows users to set animated desktop wallpapers and screensavers powered by WinUI 3. 项目地址: https://gitcode.com/gh_mirro…...

OpenClaw实战案例:Qwen3.5-9B自动化处理电商客服问答

OpenClaw实战案例:Qwen3.5-9B自动化处理电商客服问答 1. 为什么选择OpenClaw处理电商客服问答 去年夏天,我开始经营一家小型手工艺品网店。随着订单量增长,每天要处理几十条客户咨询,从"我的订单到哪了"到"退货怎…...

OpenClaw进阶配置:GLM-4.7-Flash模型参数调优实战

OpenClaw进阶配置:GLM-4.7-Flash模型参数调优实战 1. 为什么需要关注模型参数调优 去年冬天,当我第一次用OpenClaw自动整理全年会议纪要时,发现AI助手生成的摘要总带着奇怪的"官方腔调"——明明只是内部讨论,输出却像…...

百川2-13B量化版调优指南:提升OpenClaw任务成功率的关键参数

百川2-13B量化版调优指南:提升OpenClaw任务成功率的关键参数 1. 为什么需要专门调优百川模型参数? 第一次用OpenClaw对接百川2-13B量化版时,我遇到了典型的"自动化尴尬"——明明是个简单的文件整理任务,AI却总在奇怪的…...

突破组织变革困境:两本不可错过的实战书籍推荐

组织变革大概是最难的一项管理工作之一。为了帮助大家更好地去理解变革管理的全过程,在这里推荐两本组织变革必读的经典书籍,认真读完它们你将能更从容地面对组织变革议题。一、《经理人参阅:变革管理》专门讲组织变革的书籍本来就在少数&…...

实战指南:如何用Python绘制强化学习中的Reward曲线(无阴影版)

1. 强化学习Reward曲线的作用与意义 在强化学习训练过程中,Reward曲线就像是我们观察模型学习进度的"晴雨表"。每次训练时,智能体通过与环境互动获得奖励值,这些数据点连起来就形成了Reward曲线。我刚开始接触强化学习时&#xff0…...

创意工作者利器:OpenClaw驱动Qwen3-32B批量生成营销文案

创意工作者利器:OpenClaw驱动Qwen3-32B批量生成营销文案 1. 为什么需要自动化文案生成 作为长期从事数字营销的自由职业者,我每天需要为不同客户产出大量营销文案。传统工作流程中,我需要反复查阅产品文档、手动调整关键词密度、为不同平台…...

KF32A150开发第一步:手把手教你用KF32 IDE导入、编译和烧录第一个工程

KF32A150开发实战:从零完成工程导入到烧录的全流程指南 第一次接触芯旺微KF32系列MCU时,面对陌生的开发环境和工具链,很多开发者都会感到无从下手。本文将带你一步步完成KF32A150开发板的第一个程序烧录,涵盖工程导入、编译配置到…...

ARM海思平台udev启动报错:深入剖析与实战解决

1. 问题现象与背景分析 最近在调试一块搭载海思HI3531D芯片的开发板时,遇到了一个让人头疼的问题:系统启动过程中频繁出现"random: udevd: uninitialized urandom read (16 bytes read)"的错误提示。这个错误看似无害,但实际上会导…...

快充时代必备!5款USB保护芯片横评:从PW1502到PW1555怎么选?

快充时代USB保护芯片选型指南:5款主流方案深度解析 在快充技术普及的今天,USB接口的电压规格从传统的5V一路攀升至20V甚至更高。这种变化虽然带来了更快的充电速度,却也埋下了设备损坏的隐患——一个不小心将20V快充头插入仅支持5V的设备&…...

基于RS485(Modbus RTU)的工业RFID读写器CK-FR03-A01与三菱FX5U PLC的通信配置与实战应用

1. 工业RFID与PLC通信的基础认知 在自动化产线上,RFID读写器就像给物料贴"身份证"的智能哨兵,而PLC则是控制流水线动作的大脑。CK-FR03-A01这款工业级RFID读写器,通过RS485接口采用Modbus RTU协议与三菱FX5U PLC对话,就…...

SpringBoot yml 配置文件,读取 Windows 系统环境变量

SpringBoot yml 配置文件,读取 Windows 系统环境变量 在 Spring Boot 的 application.yml 配置文件中读取 Windows 系统环境变量,主要使用 ${VARIABLE_NAME} 占位符语法。 🔧 在 yml 文件中引用环境变量 在 application.yml 中,你…...

SpringBoot集成MinIO实战:从零构建企业级文件存储服务

1. 为什么选择MinIO作为企业级文件存储方案 MinIO这几年在企业级存储领域越来越火,我最早接触它是在2018年做电商项目时遇到的图片存储需求。当时对比了FastDFS、HDFS等方案后,最终选择了MinIO,现在回头看这个决定非常正确。MinIO最吸引人的地…...

ChatTTS 本地部署性能优化实战:从生成缓慢到高效推理的解决方案

最近在本地部署 ChatTTS 进行语音合成时,发现生成速度慢得让人有点抓狂。一段几秒钟的音频,等待时间却要十几秒甚至更长,这严重影响了交互体验和批量处理效率。于是,我花了一些时间深入研究,尝试了多种优化手段&#x…...

为什么顶尖量化团队集体弃用Pandas?Polars 2.0清洗基准测试结果刚解禁(含12类真实业务场景压测数据)

第一章:Polars 2.0大规模数据清洗技巧对比评测报告Polars 2.0 在查询优化器、内存管理及并行执行策略上实现显著升级,尤其在处理十亿级行宽表时展现出远超 Pandas 和 DuckDB 的吞吐稳定性。本章基于真实电商日志数据集(12.7 GB,8.…...

计算机毕设 java 基于 Android 的 “课堂管理助手” 移动应用开发 SpringBoot 安卓智能课堂管理移动应用 JavaAndroid 师生互动与教学管理平台

计算机毕设 java 基于 Android 的 “课堂管理助手” 移动应用开发 07s039,末尾的数字和英文也要加上 (配套有源码 程序 mysql 数据库 论文)本套源码可以先看具体功能演示视频领取,文末有联 xi 可分享在教育信息化快速发展的背景下…...

OpenClaw监控告警:GLM-4.7-Flash任务异常自动通知设置

OpenClaw监控告警:GLM-4.7-Flash任务异常自动通知设置 1. 为什么需要监控告警系统 上周我部署了一个基于GLM-4.7-Flash的自动化日报生成任务,结果连续三天都没收到输出。检查后发现是模型服务意外重启导致任务中断——这种"静默失败"在自动化…...

电气安全三要素:爬电距离、绝缘电阻与绝缘电压的实战解析

1. 电气安全三要素的核心概念解析 第一次接触电气安全设计时,我被各种专业术语搞得晕头转向。直到有次亲眼目睹同事调试设备时因绝缘失效引发的电弧,才真正理解这些参数不仅是纸面数据,更是保命红线。爬电距离、绝缘电阻和绝缘电压就像电气安…...

【前沿解析】2026年3月25日:从机器人协同到全模态AI生态——中关村论坛与昆仑万维双重突破定义AI产业新范式

摘要:2026年3月25日,北京中关村论坛盛大开幕,展示了跨品牌机器人协同服务与昆仑万维三大世界第一梯队模型的突破进展。本文深入解析具身智能机器人“组团上岗”的技术原理、昆仑万维Matrix-Game 3.0、SkyReels V4、Mureka V9的全模态能力,以及产业协同生态的战略价值,涵盖…...

学术专著不用愁!AI专著生成工具,高效打造专业学术精品

学术专著的魅力在于其逻辑严谨性,但在写作过程中,逻辑推理常常是最容易出现问题的部分。创作专著需要围绕核心观点进行系统的论证,不仅要对每个论点进行详细阐述,还需要处理不同学派之间的争论,确保整个框架逻辑自洽&a…...

动态感受野选择:LSKNet在遥感目标检测中的创新应用

1. 遥感目标检测的挑战与机遇 遥感图像中的目标检测一直是计算机视觉领域的重要研究方向。与常规的自然图像不同,遥感图像通常从高空俯拍,具有覆盖范围广、分辨率高、目标尺寸差异大等特点。这就带来了几个独特的挑战:首先是微小目标检测问题…...

Kronos金融预测模型:当AI学会“阅读“K线语言

Kronos金融预测模型:当AI学会"阅读"K线语言 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos 想象一下,当你面对上千只股票…...

从零到一:手把手教你搭建专属DNF私服服务器

1. 准备工作:搭建DNF私服需要哪些东西 第一次接触DNF私服搭建的朋友可能会觉得这是个技术活,其实只要跟着步骤来,完全可以在2小时内搞定。我自己搭建过不下10个版本的DNF私服,从60怀旧版到最新的110级版本都玩过。先说说需要准备的…...