登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  Golang >  Go教程

Java NMT 非堆内存排查:Direct Buffer、线程栈与 Metaspace 分析

来源:Golang学习网专题原创

时间:2026-06-11 11:03:32 826浏览 收藏

堆内存看起来稳定,但容器 RSS 持续上涨,这通常说明问题在非堆或本地内存。没有 NMT 时,很难区分 Direct Buffer、线程栈、Metaspace 和 Code Cache。

Java NMT 非堆内存排查:Direct Buffer、线程栈与 Metaspace 分析 思维导图

解决方案思路

启动时开启 NMT summary 或 detail,问题窗口用 jcmd 查看内存分类;结合线程数、Netty 指标、类加载数量和 Direct Buffer 使用量判断增长来源。

Java NMT 非堆内存排查:Direct Buffer、线程栈与 Metaspace 分析 代码讲解图

NMT 启用与查看命令

JAVA_OPTS="-XX:NativeMemoryTracking=summary"
jcmd $PID VM.native_memory summary scale=MB
jcmd $PID VM.native_memory baseline
jcmd $PID VM.native_memory summary.diff scale=MB

Java NMT 非堆内存排查:Direct Buffer、线程栈与 Metaspace 分析 运行逻辑图

运行逻辑

NMT 会把 JVM 原生内存拆成 Java Heap、Class、Thread、Code、GC、Compiler、Internal 等类别。先看 summary 定方向,再按 detail 深入。

重点观察指标

  • NMT Class、Thread、Internal、GC 分类变化
  • 线程数量与 Xss 预算
  • Direct Buffer 使用量和容器 RSS

常见误区

  • 问题发生后才想起开启 NMT
  • 把 RSS 增长全部归因于堆泄漏
  • 没有对比 baseline 和 diff

参考方案

上线检查

  • 优化前后保留同一口径的指标截图或报告。
  • 先灰度单实例或小流量,观察 P95/P99、错误率和资源指标。
  • 准备回滚开关,避免性能改动影响核心业务。
声明:本文转载于:Golang学习网专题原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>