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

如何硬核回答由物联网海量长连接场景下由于线程栈过深抢占堆外内存导致的崩溃

夏静君_8418

夏静君_8418

发布时间:2026-05-30 12:57:46

|

818人浏览过

|

来源于php中文网

原创

结论是OOM Killer杀进程源于堆外内存持续增长,根因在于虚拟线程栈配置失控与DirectByteBuffer未释放,叠加NMT未开启致问题被掩盖。

如何硬核回答由物联网海量长连接场景下由于线程栈过深抢占堆外内存导致的崩溃

直接说结论:这不是“线程太多”,而是虚拟线程栈配置失控 + DirectByteBuffer 未及时释放,叠加 NMT 未开启导致问题被掩盖。崩溃表象是 OOM Killer 杀进程,根因是堆外内存持续增长突破系统限制。

一、先确认是不是真由虚拟线程栈引发的堆外泄漏

别急着调参数——先验证归因是否准确:

  • 用 jcmd <pid> VM.native_memory summary 查看 native memory 中 Thread 和 Internal 段是否异常飙升(尤其 Thread 栈占比 >40%)
  • 对比 jcmd <pid> VM.native_memory detail 的多次快照,重点看 “reserved” 和 “committed” 在 Thread 区的增量趋势
  • 检查是否大量使用了 DirectByteBuffer(如 Netty PooledByteBufAllocator、自定义零拷贝读写)——这类对象不占堆,但其 cleaner 未触发时会锁住堆外内存

二、堵住虚拟线程栈膨胀的三个关键口子

Java 21+ 虚拟线程默认栈仍是 1MB,数十万并发下光栈就吃掉几十 GB 堆外内存:

  • 强制压栈大小:启动加 -XX:MaxVectorSize=256k(不是 -Xss,那是平台线程用的)
  • 禁用递归式深度调用:虚拟线程内避免无节制的 lambda 嵌套、层层 try-with-resources、或手动 new VirtualThread().start() 循环创建
  • 用结构化并发兜底:改用 StructuredTaskScope 管理生命周期,确保 scope.close() 后所有关联虚拟线程栈可被 JVM 及时回收

三、清理被卡住的 DirectByteBuffer

Netty 或自研通信层常因 channel 关闭遗漏、GC 时机滞后,导致 cleaner 不执行:

  • 在连接断开逻辑中显式调用 buffer.cleaner().clean()(需反射,参考知识库中 forceRelease 方法)
  • 若用 Netty,升级到 4.1.100+ 并启用 -Dio.netty.noPreferDirect=true 临时规避 direct buffer 分配
  • 对高频短连接场景,考虑改用 heap buffer + 显式 copy,用堆内存换堆外稳定

四、上线前必须做的防御性配置

不能靠出问题再排查:

  • JVM 启动必加:-XX:NativeMemoryTracking=detail + -XX:+UnlockDiagnosticVMOptions
  • 部署脚本集成定时采集:jcmd $PID VM.native_memory summary > /tmp/nmt_$(date +%s).log
  • 监控项加一条告警规则:“Thread native memory 24h 增长超 30%”,触发即查 scope 泄漏或 buffer 积压

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

二狗PPT
二狗PPT Hot

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

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

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

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

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

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

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

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5847

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2508

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5847

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2508

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4198

2023.08.10

物联网有哪些应用
物联网有哪些应用

物联网应用有智能家居、智慧城市、工业自动化、农业智能化、物流和供应链管理、医疗健康、智能交通、能源管理、环境监测、智能零售等等。详细介绍:1、智能家居,物联网技术可以将家庭中的各种设备和家居系统连接到互联网,实现智能化的家居控制和管理,例如,通过智能手机可以远程控制家中的照明、温度、安防系统等;2、智慧城市,物联网技术可以应用于城市基础设施和公共服务,实现智慧城市的建设等等。

639

2023.09.05

物联网中的m2m概念
物联网中的m2m概念

M2M是人与机器连接的手段与方式。想了解更多的相关内容,可以阅读本专题下面的文章。

3457

2024.03.12

物联网应用岗位
物联网应用岗位

常见岗位包括:物联网架构师;物联网工程师;数据分析师;云计算工程师;应用程序开发人员;嵌入式系统工程师;网络安全分析师;产品经理;物联网项目经理;业务分析师等等。想了解更多物联网应用的相关内容,可以阅读本专题下面的文章。

1695

2024.05.21

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

80

2026.10.16

热门下载

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

精品课程

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

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