生产环境OOM排查方案

Java生产环境OOM问题排查与解决方案 内存溢出(OOM)是Java应用中常见的严重问题,通常由于堆内存不足、方法区溢出或线程栈耗尽等原因引发。理解JVM内存管理机制是排查基础,包括堆内存分区、垃圾回收原理等。通过工具链(如jmap、MAT)可以获取内存快照,分析对象引用链定位泄漏源。典型应用场景包括缓存失控、线程池误用等,解决方案需结合监控体系与压测验证。掌握OOM排查技能对保障分布式系统稳定性至关重要,特别是在云原生和微服务架构下。 阅读详情

OOM(Out Of Memory)是生产环境最严重的故障之一,必须快速响应。以下是系统化的排查方案,包含‌应急处理→根因定位→解决方案‌全流程:


一、OOM分类与特征速查

OOM类型错误信息特征常见原因
‌堆内存溢出‌java.lang.OutOfMemoryError: Java heap space内存泄漏、大对象、缓存失控
‌元空间溢出‌java.lang.OutOfMemoryError: Metaspace动态类加载过多(CGLib等)
‌直接内存溢出‌java.lang.OutOfMemoryError: Direct buffer memoryNIO未释放、Netty配置不当
‌栈内存溢出‌java.lang.StackOverflowError递归调用过深、循环依赖
‌线程数溢出‌java.lang.OutOfMemoryError: unable to create new native thread线程泄漏、ulimit限制

二、黄金30分钟应急响应流程

步骤1:保留现场(关键!)

bashCopy Code

# 1. 立即保存堆转储(Heap Dump) jmap -dump:format=b,file=/tmp/heap_oom.hprof <pid> # 2. 抓取线程快照 jstack -l <pid> > /tmp/jstack_oom.txt # 3. 保存GC日志(如果开启) cp $GC_LOG_PATH /tmp/gc_oom.log # 4. 容器环境保存内存快照(如K8s) kubectl debug <pod> --copy-to=<debug-pod> -- /bin/sh

步骤2:快速恢复服务

bashCopy Code

# 1. 临时扩容内存(堆/元空间) java -Xmx8g -XX:MaxMetaspaceSize=512m ... # 2. 安全重启(容器优先重启单实例) kubectl rollout restart deploy/<app> --partition=1 # 灰度重启

步骤3:流量降级保护
  • 熔断非核心功能(如关闭报表生成)
  • 限流降级(Sentinel/Sentinel配置QPS阈值)

三、根因定位三板斧

斧1:堆内存分析(MAT/JVisualVM)

‌操作流程:‌

  1. 用Eclipse MAT加载 heap_oom.hprof
  2. 定位最大内存对象:
    
    

    javaCopy Code

    // 查看支配树(Dominator Tree) -> 按 Retained Heap 降序排序 -> 定位占用 >30% 的对象

  3. 检查可疑对象引用链:

    MAT引用链分析

‌典型内存泄漏模式:‌

  • ‌静态集合膨胀‌:static Map 持续加入数据无清理
  • ‌线程局部变量未释放‌:ThreadLocal 使用后未 remove
  • ‌资源未关闭‌:JDBC Connection、文件流未 close

斧2:元空间分析(JCMD + Arthas)

bashCopy Code

# 1. 查看类加载情况 jcmd <pid> VM.classloader_stats | grep 'Loaded' # 2. 用Arthas跟踪动态类生成 arthas> watch org.springframework.cglib.proxy.Enhancer create

‌元空间泄漏特征:‌

  • ‌Groovy/Spring CGLib代理‌:每秒新增多个 $$EnhancerBySpringCGLIB$$ 类
  • ‌OSGi热部署‌:频繁加载/卸载类

斧3:直接内存分析(Netty场景)

javaCopy Code

// 启用Direct Memory监控 -Dio.netty.maxDirectMemory // 显示配置大小 -Dio.netty.leakDetectionLevel=PARANOID // 启用泄漏检测

‌分析工具:‌


bashCopy Code

# 查看Direct Memory占用 jcmd <pid> VM.native_memory summary | grep 'Internal' # 使用Google的jemalloc分析内存分布 MALLOC_CONF=prof:true java ...


四、高频OOM场景解决方案

场景1:堆内存泄漏(静态Map引起)

‌修复方案:‌


javaCopy Code

// 原错误代码:静态Map无限增长 private static Map<String, Object> CACHE = new HashMap<>(); // 修复方案1:使用WeakHashMap(GC自动回收) private static Map<String, Object> CACHE = new WeakHashMap<>(); // 修复方案2:添加LRU淘汰策略 private static Map<String, Object> CACHE = Collections.synchronizedMap( new LinkedHashMap<>(1000, 0.75f, true) { @Override protected boolean removeEldestEntry(Map.Entry eldest) { return size() > 1000; } } );

场景2:元空间溢出(Spring CGLib代理过多)

‌修复方案:‌


javaCopy Code

// 在启动参数限制代理类缓存 -XX:+UseLambdaFormInvokers // JDK8+优化invoker -Dspring.objenesis.ignore=true // 禁用Spring Objenesis缓存 // 代码层面:避免滥用@Scope("prototype") @Bean @Scope(proxyMode = ScopedProxyMode.NO) // 禁用代理 public MyBean myBean() { ... }

场景3:Netty直接内存泄漏

‌修复方案:‌


javaCopy Code

// 确保ByteBuf引用计数归零 try { ByteBuf buf = ...; // 业务逻辑 } finally { ReferenceCountUtil.release(buf); // 强制释放 } // 启用Netty内存检测(生产环境谨慎) ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.PARANOID);


五、防御性编程与监控加固

1. 代码规约

javaCopy Code

// 强制规则1:所有资源实现AutoCloseable try (Connection conn = dataSource.getConnection()) { ... } // 自动关闭 // 强制规则2:ThreadLocal必须remove ThreadLocal<User> userHolder = ...; try { userHolder.set(user); ... } finally { userHolder.remove(); }

2. 监控基线配置

yamlCopy Code

# Prometheus监控规则 groups: - name: JVM OOM预警 rules: - alert: HeapMemoryOver85% expr: jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"} > 0.85 for: 5m - alert: MetaspaceOver90% expr: jvm_memory_used_bytes{area="nonheap", id="Metaspace"} / jvm_memory_max_bytes{area="nonheap", id="Metaspace"} > 0.9

3. 压测验证

bashCopy Code

# 使用JMeter模拟OOM场景 jmeter -Jthreads=500 -Jrampup=60 -n -t oom_test.jmx


六、终极武器:堆转储分析技巧

  1. ‌MAT过滤技巧‌:

    
    

    sqlCopy Code

    // 查找疑似泄漏点(按类分组) SELECT * FROM java.util.HashMap WHERE size() > 1000 // 查找大数组 SELECT * FROM byte[] WHERE length > 1048576 // >1MB

  2. ‌对比分析‌:

    • 在压测前后分别dump堆内存
    • 使用MAT的「Compare Basket」功能定位增长对象

‌核心原则‌:

  • 优先保存现场再重启
  • 堆转储文件 > 日志 > 猜测
  • 根治方案 = 代码修复 + 资源约束 + 监控告警

通过以上流程,可将OOM平均解决时间(MTTR)从小时级降至分钟级,并有效预防复发。

记录xx项目生产oom导致dump,通过jvisualvm排查.hprof文件找出问题根源 记录xx项目生产dump排查 1.描述 20200229 6点生产某台机器宕机重启,通过运维拿出dump文件(:java_pid1(2020-02-29).hprof),如图 刚开始接收dump文件不知道如何排查,公司同事用jprofile9,用这个看不出什么。故保存dump后续研究 ==================================================================================== 20210329 学习jvm后通过visu 阅读详情

相关推荐

Linux内核OOM Killer机制深度解析:从配置到实战

本文深入解析Linux内核的OOM Killer机制,从触发条件、进程选择算法到实战配置和高级调优技巧。通过详细的内核参数设置、进程防护策略及源码分析,帮助开发者有效应对内存耗尽问题,确保关键服务稳定运行。特别适合系统管理员和运维工程师优化服务器内存管理。

weixin_42563415的博客 380

内存溢出OOM的问题排查流程

Mat内存分析内存溢出问题

qq_16369559的博客 4324

元空间OOM的根本原因是什么?

元空间OOM的本质是​​类元数据生命周期管理失控​​,或​​资源分配不足​​导致。与堆内存OOM不同,元空间溢出后Full GC无法回收内存(除非卸载类),因此需通过代码优化、缓存机制、配置调优综合解决。生产环境中建议对元空间使用率设置监控告警,早于OOM发生前干预。

mzjvw23506的博客 707

OOM(Java heap space)排查流程记录

这是Ergonomics堆大小限制,它是根据系统配置和运行时情况自动调整的。:这是每个垃圾回收线程的堆大小,它指定了每个垃圾回收线程可以使用的堆内存量。:这是Java虚拟机在启动时分配的初始堆大小。:这是启用大页内存的阈值,当堆大小达到或超过该阈值时,Java虚拟机将尝试使用大页内存。:这是Java虚拟机允许的最大堆大小。当堆的大小达到这个限制时,Java虚拟机将停止分配更多的内存。

qq_41723044的博客 1488

一次OOM问题排查过程实战记录

主要给大家介绍了一次OOM问题排查过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

3D Slicer5.7在win11下的源码编译安装

本博客主要参考官方安装文档以及部分优快云的博客,部分内容的书写会直接参考官方文档的内容。

Topsort的博客 4759

JVM如何排查OOM

如果有任何想法、疑问,或者想分享你的相关经历,欢迎在评论区留言交流,你的每一条互动对我来说都很珍贵~ 我们下次再见啦!当JVM(Java虚拟机)出现OOM(OutOfMemoryError)时,可以按照以下步骤和方法,用于帮助定位和解决JVM中的OOM问题。1.查看异常堆栈信息。2.分析内存使用情况。

2402_85030292的博客 809

基于单片机负载控制的无人机电气设备监测系统设计

为深入分析无人机电气设备的电子负载性能,实现对传输电子量的合理性监管与控制,设计基于单片机负载控制的无人机电气设备监测系统;利用电气信号发生电路,构建负载网络控制器与以太网模块运行所需的电气设备负载环境,借助PCB监控板建立PLC扩展负载模块与核心监控主机之间的物理连接关系,实现无人机电气设备监测系统的硬件执行环境搭建;在此基础上,通过STM32型单片机移植协议,确定无人机电气设备通信主机的现有组态形式,联合已设定的监控任务有线级条件,实现监测系统的软件执行环境搭建,完成基于单片机负载控制的无人机电气设备监

weixin_45905610的博客 1300

15分钟拯救你的ControlNet服务:从OOM崩溃到日均10万请求的实战指南

你是否经历过这样的噩梦:刚部署的controlnet-openpose-sdxl-1.0服务在流量高峰期突然雪崩,GPU显存瞬间爆满,推理延迟从500ms飙升至12秒,最终所有请求全部超时?本文将通过5个生产级故障案例、8套架构优化方案和12条显存优化实践,让你的ControlNet服务稳定性从92.3%提升至99.95%,同时降低35%资源成本。 读完本文你将掌握: - 3种显存优化技术解决O...

gitblog_02272的博客 458

DOSBOX 0.74模拟器安装Windows 95

DosBox本身带有5.0版的DOS系统,启动后虚拟一个Z盘存放有Dosbox特有的外部指令,如config.com、imgmount.com等,经测试,可以顺利安装各版本的windows 3.1系统,但是不能安装win95,需要用原版的dos镜像启动才能安装。1. 获取启动盘镜像文件 下载Win95启动软盘镜像文件,名为boot.img,放到DosBox 0.74的目录下。2. 制作硬盘镜像文件

xjnzhidao的博客 9309

TongWeb微服务部署实战:Nacos注册与网关路由的疑难解析

本文分享了将Spring Cloud微服务迁移至TongWeb应用服务器时,解决Nacos服务注册失败与Spring Cloud Gateway路由失效的实战经验。针对Nacos注册问题,通过实现ApplicationRunner接口并利用JMX获取容器端口,实现了手动注册;针对网关路由问题,建议将基于WebFlux的Gateway模块改为JAR包独立部署,以保障其原生运行环境。文章为在TongWeb上进行微服务部署提供了关键的问题排查思路与混合架构部署的最佳实践。

weixin_29209801的博客 240

ThingsBoard生产环境故障排查实战:从OOM到MQTT断连的完整处置方案

物联网平台在生产环境中的稳定性,往往取决于故障发生前是否具备完善的监控预警与故障预案。ThingsBoard作为设备接入、数据路由与规则处理的核心枢纽,其集群架构下任何组件异常都可能沿数据流向下游传导,引发设备批量离线、消息堆积或存储性能劣化等连锁故障。理解ThingsBoard的组件边界与数据流向,是高效排查的前提。生产环境故障处理应以恢复业务为第一目标,先保留现场信息,再定位根因。本文从可观测性建设、典型故障实录、常用排查工具三个维度,结合OOM、MQTT断连、Kafka积压等高频场景,梳理出一套可落地

weixin_29171129的博客 208

利用requests库下载bilibili字幕文件

文章目录1. 前言2. 程序下载大法好2.1 挖掘思路2.2 核心知识点2.3 汇总代码 1. 前言   之前的博客介绍了使用工具下载B站视频,但美中不足的是无法下载字幕。为了提高效率,将下载字幕的工作用程序自动化处理。 2. 程序下载大法好 2.1 挖掘思路   在谷歌浏览器中按下F12,打开谷歌开发者工具。搜索subtitle,则会得到一个json文件,如下图所示:   在网页中空白位置点击查看网页源代码,然后通过搜索(Ctrl+f)查找subtitle,则会发现在subtitle_url中包含了对应

herosunly的博客 4万+

Kubernetes生产实战(二十二):深度排查Pod内存溢出(OOM)问题指南

OOMKilled不是终点,而是优化契机。通过本文的立体化排查方案,您不仅能快速止血,更能从根本上提升系统稳定性。记住:生产环境中,预防永远比救火更重要。终极建议:将内存监控纳入CI/CD流水线,在镜像构建阶段检测资源参数配置,把问题消灭在上线之前。

sre救赎之路 1375

apollo自动驾驶进阶学习之:如何实现施工路段限速绕行及其参数调试

首先需要理解Planning模块是基于Scenario、Stage、Task这样的层次来进行的,即场景->步骤->具体的决策方法。Apollo可以应对自动驾驶所面临的不同道路场景,都是通过Scenario统一注册与管理。Scenario通过一个有限状态机来判断选择当前行车场景,每个Scenario下又有多个Stage,指当前场景下需要执行的粗略步骤。.........

qq_41593516的博客 6596

手把手教你 Ubuntu 24.04 离线安装 Ollama

本文介绍 Ubuntu 下离线安装 Ollama 并使用 Ollama 部署 llama3.1-70b 大模型

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 1018

生产大文件下载导致 OOM,顺藤摸瓜拿下

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 2.8 分钟。来自:飞天小牛肉上周遇到了生产环境 OOM 的问题,找了一番之后基本定位了是大文件下载导致的问题,于是在网上搜罗了一番文章,下面分享一篇优质的解决方案,整个排查思路非常清晰,小白可以直接对照着来排查。事故发生上周五下午运营人员反馈,笔者所负责的后台系统从 14 点以后就卡卡的,虽然页面能够正常加载,但是一直处于数据...

良月柒 283

Python爬虫实战:采集行业协会、研究机构等平台的政策文件列表与PDF链接批量收集系统,支持自动下载、分类归档和数据库管理(SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 640

生产环境又OOM了,这次是Mybatis的锅?

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!每天14:00更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业调度中间件 Elast...

weixin_44421461的博客 169

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Linux OOM Killer机制的解析与优化

通过综合运用上述策略,可显著降低OOM事件发生概率。对于关键业务系统,建议采用内存控制(Cgroups)+ 优先级调整(oom_score_adj)+ 实时监控的组合方案。

完颜振江 794

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

生产环境 OOM 排障复盘:一个实习生遇到的真实内存泄漏

看趋势:内存是持续增长还是间歇性峰值?前者是泄漏,后者可能是业务特征。看对象:Heap Dump 中占比最大的是什么对象?它的引用链是什么?看缓存:缓存是否设置了容量上限和过期时间?看连接:数据库连接、HTTP 连接是否被正确关闭和归还?看线程:ThreadLocal 在线程池环境中是否被清理?OOM 不是问题本身,是问题最后的表现。在它之前一定有内存使用率持续上升的征兆。建立内存监控,在 75% 告警时介入,比在 100% OOM 时救火要好得多。

cannonjinx的博客 4622

生产环境 OOM 排查与解决实践

慢慢涨、重启无效,多半是泄漏突然炸、高峰触发,多半是溢出Heap Dump 生成不是自动持续生成的OOM 自动生成JVM 在抛出前,尝试写 dump 文件堆中存活对象及引用关系会被捕获手动生成可以在非 OOM 情况下生成 snapshotOOM 先留证类型先分清分析盯三点:谁最多、谁在引、谁在涨内存泄露的根因,不是 GC 能力不足, 而是对象“该结束却没结束”。四句话记忆:入口层控制并发(Semaphore / 权重)队列容量有界执行层线程池异步处理堆水位实时监控。

weixin_44876263的博客 490

【Java】【JVM】OOM 原因、定位与解决方案

JVM `OutOfMemoryError` 是生产环境中最致命的故障之一,直接导致应用崩溃。系统掌握 OOM 的触发场景、定位工具和解决方案,是 Java 开发者的核心能力

瘦到被风吹走的博客 1330

记一次无 jmap 环境下的 P0 级 OOM 故障硬核排查

【摘要】某在线监控系统出现P0级故障,服务不定时卡死且CPU占用异常。在标准调试工具失效的情况下,通过分析发现系统陷入严重的GC抖动状态。采用"极限施压法"主动诱发OOM,成功定位到内存泄漏问题。根因分析显示业务代码中存在日期比较死循环,导致LinkedList无限膨胀。最终通过修改循环逻辑和增加边界校验解决问题,并建议保留OOM自动Dump配置作为兜底措施。本次排查凸显了在工具受限时,深入理解JVM机制的重要性。

m0_63801909的博客 592

centos7.6查看什么进程跑的流量_记一次生产服务器进程突然消失问题排查!

你知道的越多,不知道的就越多,业余的像一棵小草!你来,我们一起精进!你不来,我和你的竞争对手一起精进!编辑:业余草推荐:https://www.xttblog.com/?p=5097记一次生产服务器进程突然消失问题排查!前言很早都想写这篇文章了,一直迫于时间上的约束,拖到了今天。这件事是真实的发送在我们的生产环境上,其中的一台服务器上跑着 4 个 jar 程序,隔三差五的会发送进程突然消...

weixin_39757122的博客 220
上一篇: 生产GC问题排查方案
下一篇: kafka消费顺序保障
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值