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

为什么触发了系统OOM而没触发JVM OOM

核心原因在于JVM OOM只关心Java堆而系统OOM关心的是进程占用的所有物理内存。一句话回答系统OOM发生时Java堆可能远没满但进程的总物理内存堆堆外线程栈元空间JNI等超过了系统可用内存内核直接杀进程JVM根本没机会抛出OOM。详细原因分析JVM的内存构成远不止堆┌─────────────────────────────────────────────┐ │ Java进程总物理内存(RSS) │ ├─────────────────────────────────────────────┤ │ ┌─────────────────────────────────────┐ │ │ │ Java堆-Xms/-Xmx控制 │ │ ← JVM OOM只监控这块 │ │ 这部分满了才会抛OOM │ │ │ └─────────────────────────────────────┘ │ │ ┌─────────────────────────────────────┐ │ │ │ 堆外内存不受-Xmx控制 │ │ │ │ - DirectByteBuffer │ │ │ │ - NIO buffer │ │ │ │ - Unsafe.allocateMemory() │ │ │ └─────────────────────────────────────┘ │ │ ┌─────────────────────────────────────┐ │ │ │ 线程栈-Xss控制 │ │ │ │ 1000线程 × 1MB 1GB │ │ │ └─────────────────────────────────────┘ │ │ ┌─────────────────────────────────────┐ │ │ │ 元空间-XX:MaxMetaspaceSize│ │ │ └─────────────────────────────────────┘ │ │ ┌─────────────────────────────────────┐ │ │ │ JNI代码中的malloc内存 │ │ │ └─────────────────────────────────────┘ │ │ ┌─────────────────────────────────────┐ │ │ │ CodeCache、GC开销等 │ │ │ └─────────────────────────────────────┘ │ └─────────────────────────────────────────────┘典型场景堆没满但系统OOM了场景Java堆使用进程总RSS结果堆外内存泄漏2GB/4GB (50%)7.5GB/8GB系统OOM Kill无JVM OOM线程爆炸3GB/4GB (75%)7.8GB/8GB系统OOM Kill正常情况3GB/4GB (75%)4.5GB/8GB正常具体案例案例1堆外内存泄漏// 问题代码不断分配堆外内存不释放while(true){ByteBufferbufferByteBuffer.allocateDirect(1024*1024);// 1MB堆外// 没有调用DirectBuffer.cleaner().clean()}过程Java堆一直正常只是分配了一个ByteBuffer对象很小堆外内存每分钟泄漏1GB2小时后系统物理内存耗尽 → 内核杀Java进程JVM根本没发现堆有问题不会抛OOM案例2线程爆炸// 问题代码使用无界线程池ExecutorServicepoolExecutors.newCachedThreadPool();while(true){pool.submit(()-{Thread.sleep(3600000);// 线程不退出});}过程每个线程占用栈内存默认1MB创建5000个线程 5GB堆外内存线程栈Java堆可能只有几百MB系统内存耗尽 → 杀进程JVM堆正常不抛OOM案例3JVM参数设置过大# 物理内存只有8GB的机器-Xmx7g# 堆占7GB过程JVM启动时堆分配7GB虚拟内存实际物理内存堆用5GB 线程栈 元空间 OS 7.5GB其他进程监控、Agent等需要1GB总需求超过8GB → 系统OOM Kill图解为什么JVM不抛OOMJVM判断是否抛OOM的逻辑 if (堆剩余空间 需要分配的对象大小) { // 尝试Full GC if (GC后仍不够) { 抛出 OutOfMemoryError: Java heap space } } 问题堆外内存、线程栈等根本不在这个判断逻辑里快速自查命令# 1. 查看Java进程的内存构成pmap-xPID|tail-1# 输出total xxx K# 2. 查看各部分的详细分布需要NMTjcmdPIDVM.native_memory summary# 3. 查看系统内存free-h# 如果available充足但进程被杀了说明是单个进程内存超限# 如果available很少说明整体内存不足一句话总结JVM OOM监控的是堆这个小水池系统OOM监控的是整个Java进程这个大水池。堆没满但线程栈、堆外内存、元空间等其他部分加起来把系统内存耗尽了内核就会直接杀进程JVM根本来不及反应。预防方案# 1. 堆外内存限制-XX:MaxDirectMemorySize512m# 2. 线程栈限制-Xss256k# 减小单线程栈大小# 3. 元空间限制-XX:MaxMetaspaceSize256m# 4. 堆内存不要超过物理内存的70%-Xmx: 物理内存 *0.7# 5. 监控进程RSS而非只监控堆ps-pPID-orss,vsz,comm
http://www.gsyq.cn/news/1330343.html

相关文章:

  • G-Helper全面升级:华硕笔记本轻量化智能控制完整指南
  • 从水下机器人到你的桌面:我是如何用WSL2+北通XBOX手柄搞定硬件控制的
  • Turborepo最佳实践:构建高性能Monorepo架构
  • OpenCV实战:用Python和Hough变换5分钟搞定图片中的直线和圆检测
  • NVM安装后npm命令无效?手把手教你排查Windows环境变量与路径配置的常见坑
  • CTF新手必看:手把手教你破解BUUCTF那道‘从娃娃抓起’的汉字编码题(附完整电码/五笔对照表)
  • 别再为高维数据发愁了!用R语言glmnet包5步搞定LASSO回归变量筛选
  • 别再只会用BurpSuite了!用Kali Linux的SEToolkit复现一次真实的钓鱼攻击(附完整命令与截图)
  • 2026定西市安定区黄金回收铂金回收白银回收深度实测 五大正规门店横屏 报价透明 免费上门才是真靠谱 - 亦辰小黄鸭
  • 2026福州市台江区黄金回收铂金回收白银回收深度实测 五大正规门店横屏 报价透明 免费上门才是真靠谱 - 亦辰小黄鸭
  • Mission Planner终极教程:从零开始掌握专业无人机地面站软件
  • 嵌入式硬件调试全流程:从目视检查到性能测试的实战指南
  • 别再只会用菜刀了!手把手教你用中国蚁剑连接PHP一句话木马(附实战靶场环境)
  • 解密PHP开发者的版本魔法:phpenv如何重塑你的工作流
  • 为什么头部AI Lab紧急叫停自研搜索项目?DeepSeek垂直引擎上线即替代原有ES集群的4个底层突破
  • 【企业级AI平台接入标准】:DeepSeek OAuth SSO 单点登录集成白皮书(含国密SM2兼容方案)
  • 哔咔漫画下载器:如何轻松构建个人离线漫画图书馆?
  • G-Helper终极指南:3分钟告别Armoury Crate臃肿,释放华硕笔记本真正性能
  • 通过Nodejs快速调用Taotoken多模型API的详细步骤
  • RK3568扩展模块实战:4G/Wi-Fi 6/多串口集成与Linux驱动适配
  • 2026郴州市苏仙区黄金回收铂金回收白银回收深度实测 五大正规门店横屏 报价透明 免费上门才是真靠谱 - 亦辰小黄鸭
  • ESP32-C3/S3烧录避坑指南:为什么你的8MB固件识别为0?附Thonny与乐鑫工具正确用法
  • 将taotoken作为统一api层整合到企业内部多个ai应用场景中
  • txt怎么转pdf?免费在线转换工具2026实测对比 - AI测评专家
  • FanControl终极指南:5步实现Windows风扇精准控制与静音优化
  • 【限时解密】DeepSeek私有IaC元框架V2.3:内置AI驱动的配置漂移检测、合规性自愈引擎与跨云拓扑图谱生成器
  • 2026水处理设备厂家:反渗透、超纯水、软化水设备靠谱品牌推荐 - 深度智识库
  • 嘉兴黄金回收三大正规品牌,闪明钻排行第一,价格透明全城上门安心 - 润富黄金珠宝行
  • 2026年宁波同城实体店短视频引流与GEO精准获客完全指南 - 优质企业观察收录
  • Light Chaser:现代数据可视化设计平台的技术探索与实践指南