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

JVM 堆外内存溢出问题怎么排查解决

落涛酱_6321

落涛酱_6321

发布时间:2026-10-26 06:41:38

|

787人浏览过

|

来源于php中文网

原创

堆外内存溢出(Direct buffer memory)需确认泄漏类型→定位allocateDirect调用源→阻断未释放行为;通过NMT监控、jcmd分析Direct区、检查Netty/NIO缓冲区释放,显式设-XX:MaxDirectMemorySize并池化复用。

jvm 堆外内存溢出问题怎么排查解决

JVM 堆外内存溢出(`java.lang.OutOfMemoryError: Direct buffer memory` 或进程 RES 持续上涨远超 `-Xmx`)不能靠加堆解决,因为堆外内存压根不走 GC 管理,也不受 `-Xmx` 限制。排查关键在于:**确认是否真为堆外泄漏 → 定位分配源头 → 阻断未释放行为**。

看现象,先区分是“Direct Memory”还是“Native Memory”泄漏

不是所有堆外增长都叫 DirectBuffer 溢出:

  • Direct buffer memory:报错明确带这串文字,说明 `ByteBuffer.allocateDirect()` 分配的堆外内存没释放,或 `MaxDirectMemorySize` 设置过小(默认≈`-Xmx`);
  • Native memory leak(如 JNI、NIO Channel、压缩/加密库等):无明确 OOM 报错,但 `top` 中 RES 持续上涨(比如 `-Xmx=2g`,RES 却涨到 5g+),且 `jstat`、`jmap` 显示堆内正常;
  • Metaspace / Thread / CodeCache 异常增长:虽属“非堆”,但属于 JVM 自管理区域,可通过 `jstat -gcmetacapacity` 或 `jcmd VM.native_memory summary` 快速排除。

用工具抓证据,别靠猜

启动时务必加参数,出问题才有依据:

  • 启用原生内存追踪:-XX:NativeMemoryTracking=detail(有约5%性能开销,建议预发/线上低峰开启);
  • 监控 DirectBuffer 使用:-XX:+PrintGCDetails -Xlog:gc+metaspace+native_memory=debug(JDK11+);
  • 运行中检查:jcmd <pid> VM.native_memory summary scale=MB</pid>,重点关注 Internal、Other、Thread 和 Direct 三栏变化;
  • 查 DirectBuffer 分配点:jstack <pid> | grep -A5 -B5 "allocateDirect"</pid>,结合业务代码定位调用方。

常见泄漏点和修复方式

堆外泄漏往往藏在“看起来很安全”的封装里:

Java注释规范Skills
Java注释规范Skills

当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。

下载
  • NIO 文件读写未关闭:`Files.readAllBytes(path)` 返回 byte[] 不涉及 DirectBuffer,但 `FileChannel.map()` 或 `AsynchronousFileChannel` 的 `read(ByteBuffer, ...)` 若传入 `allocateDirect` 缓冲区且未复用/清理,会累积;
  • Netty / Dubbo 等框架缓冲区未释放:`ByteBuf.release()` 忘调、`PooledByteBufAllocator` 配置不当、或 `ReferenceCounted` 对象被 static 引用持有;
  • 自定义 JNI 库未 free 内存:C/C++ 层 malloc 后未对应 free,或 Java 层未触发 `Cleaner` 回调;
  • ZipInputStream / Cipher / ImageIO 等 JDK 类内部使用 DirectBuffer:尤其在流式处理大文件时,未及时 close 导致底层 DirectBuffer 无法回收。

修复原则:显式释放、池化复用、避免静态持有。例如 Netty 场景下,确保每个 `ByteBuf` 在 handler 处理完后调用 buf.release();NIO 场景下优先用 `ByteBuffer.wrap(byte[])` 替代 `allocateDirect`,或严格配合 try-with-resources。

兜底配置与验证

参数只是辅助,不能替代代码修复:

  • 设上限防失控:-XX:MaxDirectMemorySize=512m(根据业务峰值合理设置,勿盲目调大);
  • 避免堆外与堆争内存:-Xmx2g -XX:MaxDirectMemorySize=512m,总和不超过容器/物理内存;
  • 上线后验证:用 `jcmd VM.native_memory detail.diff` 对比两次快照,确认 `Direct` 区不再持续增长;
  • 长期运行观察:重点盯 `top -p -b -n 2 | grep 'RES'`,确认 RES 趋于平稳而非单边爬升。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

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

豆包大模型

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

WorkBuddy

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

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

切问学术

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

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Laper
Laper Hot

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

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

11237

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

8342

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

7192

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1204

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

968

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1436

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2969

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

20211

2023.08.03

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

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