怎么分析 JVM 的 MetaSpace 堆外泄露排查:通过 jcmd VM.metaspace 追踪类元数据
怎么分析 JVM 的 MetaSpace 堆外泄露排查:通过 jcmd VM.metaspace 追踪类元数据

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
直接看 jcmd VM.metaspace 输出是否可信
答案是:不可信。这里有个常见的理解误区。这个命令展示的,仅仅是当前已加载类的元数据内存用量。它看不见那些已经卸载、但还没被 Metaspace 内部回收的“残留块”,更统计不到 Native 层通过 mmap 分配、却未归还给 Metaspace 管理的内存。所以,你看到 used 显示 256MB、committed 显示 384MB,并不代表真实的堆外内存增长就到此为止了。
一个典型的误判场景是:MetaspaceSize 参数设置得太小(比如沿用默认的 21807104 字节,约 20.8MB),导致频繁触发扩容和内存碎片化。这时 jcmd 可能会显示 committed 持续上涨,但 used 却基本不动——这其实是 Metaspace 自身的管理开销在增加,并非真正的内存泄漏,却很容易被当成问题的根源。
jcmd VM.metaspace 要结合 -XX:NativeMemoryTracking=detail 一起用
单独运行 jcmd pid VM.metaspace,视野是受限的。它只能看到类元数据这一层的汇总情况,无法透视底层内存是通过 mmap 还是 brk 分配的,也无从知晓 ClassLoader 是否因为被引用而无法卸载。
正确的做法是:
- 务必加上 JVM 参数:
-XX:NativeMemoryTracking=detail,然后重启应用。 - 再执行命令:
jcmd pid VM.native_memory summary scale=MB,重点关注Metaspace和Internal这两栏。 - 如果发现
Metaspace栏增长缓慢,但Internal栏却在持续上涨(尤其是伴随着大量64MB大小的匿名映射出现),那基本可以排除纯 Ja va 类加载导致的泄漏,问题很可能指向了 Native 层,比如 JNI 调用、Netty 的Unsafe操作,或者某些 JDBC 驱动。
查 Metaspace 泄漏,真正要盯的是 ClassLoader 生命周期
这里有个核心逻辑需要厘清:Metaspace 本身并不会“泄漏”,真正会“泄漏”的,是那些无法被垃圾回收(GC)的 ClassLoader。只要一个 ClassLoader 还活着,由它加载的所有类的元数据就会一直占据着 Metaspace 的空间。
导致 ClassLoader 无法回收的典型原因有哪些呢?
- Web 应用热部署时,旧的
WebAppClassLoader被新实例替换,但线程池、定时任务或某些静态缓存里,还残留着对旧 loader 的引用。 - 代码中使用了
ThreadLocal或缓存了Class.forName(“xxx”)返回的Class对象,并且没有及时清理。 - 某些第三方 SDK(比如一些老版本的 Druid、Logback)在 shutdown 时,没有正确释放其内部的 ClassLoader。
如何验证?可以使用 jcmd pid VM.class_hierarchy -all 来查看活跃的 ClassLoader 数量;或者,对堆内存进行 dump,然后用 MAT 等工具检查 ja va.lang.ClassLoader 的实例数量,看它是否随着请求量增加而线性增长。
pmap -x 和 /proc//smaps 是绕过 JVM 层的底线手段
当 jcmd VM.metaspace 和 native_memory 都显示一切正常,但物理内存(RSS)却持续上涨时,就必须跳出 JVM 的视角,直接去操作系统层面检查内存映射了。
需要关注的关键信号包括:
- 执行
pmap -x,如果出现大量相同大小的匿名映射(anon),并且这些地址段不在| grep “64M\|128M” jcmd VM.native_memory的报告范围内,那就非常可疑。 - 运行命令
grep -i “mmap” /proc/,如果计算结果远超过/smaps | awk ‘{sum += $2} END {print sum/1024/1024 “ GB”}’ jcmd中Internal + Metaspace的总和,也说明有“账外”内存。 - 这类内存通常来源于 Netty 的
PooledByteBufAllocator、JDBC 驱动的 native buffer,或者自定义的 JNI 库——它们完全游离于 Metaspace 的管理体系之外。
说到底,Metaspace 只管类的定义信息,管不了字节码加载器背后的 native buffer、direct memory,甚至是 mmap 文件映射。真要定位到根因,得从这些 64MB 内存块所在的 mmapped file 或 heap 标签反推调用栈,而不是一直盯着 VM.metaspace 的输出反复刷新。这才是关键所在。
相关攻略
三星智能眼镜设计细节曝光,与Meta Ray-Ban高度相似 最近科技圈又有新料了。根据最新泄露的信息,三星即将推出的Galaxy智能眼镜,在设计上竟然和Meta的Ray-Ban智能眼镜“撞了脸”,相似度颇高。这款内部代号为“Jinju”的新设备,预计最快在下个月的Google I O大会上就会正式
消息称 Meta 正投资研发基于 AI 驱动的仿生机器人,计划成为“行业安卓”定义整个平台 彭博社近日的一则报道,透露了 Meta 公司一个颇具雄心的新动向。他们正大举押注一个前沿领域:由 AI 驱动的仿生人形机器人。根据其规划,Meta 的目标是“打造能够像人类一样执行任务并帮助人们完成体力活的机
联发科推出两款多模态轻量级 AI模型:主打繁体中文处理能力、基于 Meta Llama 3 2 打造而成 最近,AI圈又迎来了一对“轻量化”新选手。来自联发科创新基地的两款多模态模型正式亮相,一款是号称能在手机上流畅运行的 Llama-Breeze2-3B,另一款则是为轻薄笔记本电脑场景设计的 Ll
三星 Galaxy Glasses 渲染图曝光:无屏设计,搭载骁龙 AR1 芯片 科技圈最近又有新动静了。根据 Android Headlines 最新曝光的渲染图,三星正在筹备一款名为 Galaxy Glasses 的智能眼镜。从外观上看,它似乎走了当下流行的路线,设计风格与 Meta 的 Ray
Meta的“不分享”辩护:AI训练数据版权战的又一新战线 本周,AI界的一桩版权官司又添新料。在一份法庭文件中,Meta公司针对使用“影子图书馆”数据训练其LLaMA模型的指控,抛出了一条技术性极强的辩护理由:公司确实下载了多达82TB的盗版版权资料,但其员工通过技术设置,确保了在整个下载过程中没有
热门专题
热门推荐
霸王茶姬回应顾客喝出疑似水银物质:门店称流程不可能出现,正配合调查 近日,一则关于新茶饮的消费纠纷引发了广泛关注。据媒体报道,安徽宿州一位消费者反映,其在霸王茶姬砀山万达广场门店购买的饮品中,发现了疑似水银的液态金属物质。 根据消费者描述,事情始于饮用时尝到的异常颗粒感。随后仔细查看,竟在杯底发现了
2026款哈弗H9正式上市:硬派越野的全面进阶 4月28日,备受关注的2026款哈弗H9公布了最新动态。新车指导价定在19 99万至24 79万元区间,并推出了颇具吸引力的限时换新价——17 49万元起,顶配车型也仅需22 29万元。这个价格策略,无疑让硬派越野的门槛变得更亲民了。 外观:硬朗气场再
在Ubuntu系统中配置Ja va路径 在Ubuntu系统里配置Ja va环境,其实是个挺常见的需求。这事儿说简单也简单,核心就两步:设置好JA VA_HOME环境变量,再把Ja va的可执行文件路径加到PATH里。下面咱们就一步步来,把这事儿彻底搞定。 第一步:安装Ja va 如果你系统里还没装J
小米汽车发布五一假期专项售后服务,为车主出行保驾护航 五一假期将至,出行高峰随之而来。就在今天,小米汽车正式发布了针对2026年五一假期的专项售后服务保障方案。这项服务聚焦车主在假期出行中可能遇到的各类突发状况,推出了一系列重磅权益,覆盖了整个假期时段,从4月29日一直持续到5月6日。 此次专项服务
在Ubuntu系统中调整Ja va内存设置 在Ubuntu系统上运行Ja va应用,内存配置是个绕不开的话题。调得好,应用跑得飞快;调得不对,性能瓶颈甚至崩溃都可能找上门。好在调整方法并不复杂,关键得找准场景。下面这张图,可以帮你快速建立起一个直观的印象: 接下来,咱们就聊聊几种主流的调整路径,你可





