jcmd无法直接查询方法区中“变量类”的详细内存统计,仅能通过VM.metaspace等命令查看元空间汇总信息;精准分析需用jmap生成堆转储并配合MAT等工具定位类及静态变量内存占用。
使用
无法直接查询方法区(元空间)中“变量类”的详细统计,因为它不提供类级别内存占用的细粒度分析,尤其不支持按字段或静态变量维度统计内存。真正能完成该任务的是
配合
或 MAT(Eclipse Memory Analyzer),而
的作用更偏向于轻量级运行时诊断和触发操作。
明确 jcmd 在类加载与元空间中的实际能力
主要用于向 JVM 发送诊断命令,对类加载相关的信息支持有限但实用:
:可查看包括元空间(Metaspace)在内的本地内存总体使用概况,但不区分具体类
:输出当前已加载类的继承树(JDK 17+),便于观察类加载结构,无内存数据
:显示元空间各区域(如 used、committed、capacity)大小及 GC 相关统计,是唯一与元空间直接相关的命令,但仍是汇总值
想查“某个类及其静态变量占多少内存”?得用 jmap + 分析工具
静态变量属于类元数据的一部分,存储在元空间;但其引用的对象(如 static Map、大数组)通常位于堆中。要定位具体类的内存开销,需分两步:
先用
查看每个类加载器加载的类数量和元空间占用估算(注意:这是近似值,非精确字节计数)
再用
生成堆转储,用 MAT 打开 → “Dominator Tree” 或 “Histogram” 中筛选类名 → 查看 “Shallow Heap”(对象头大小)和 “Retained Heap”(该类实例及其独占引用链总大小)
对静态字段,MAT 中可右键类 → “Merge Shortest Paths to GC Roots” → 过滤 “with all references”,确认哪些静态变量持有大量对象
元空间本身爆满?优先检查类加载器泄漏
元空间 OOM 常因动态类生成过多(如 CGLIB、Groovy、OSGi)且类加载器未被回收。此时应:
执行
,关注
和
差值是否持续扩大
配合
(JDK 12+)查看各加载器加载类数、存活类数、是否可卸载
若发现某自定义 ClassLoader 加载类数异常增长且
为 0,大概率存在泄漏
小结:jcmd 是快筛工具,不是内存剖析器
它适合快速判断元空间是否紧张、是否有异常类加载行为,但不能替代堆转储分析来定位具体类或静态变量的内存消耗。真要回答“某个类的变量占多少内存”,必须结合
抓堆、MAT 做对象图分析,并理解元空间只存类型元信息(如常量池、字段/方法签名),而实际数据对象都在堆里。
jcmdjmapjhatjcmdjcmdjcmd VM.native_memory summary jcmd VM.class_hierarchy jcmd VM.metaspace jmap -clstats jmap -dump:format=b,file=heap.hprof jcmd VM.metaspace capacityusedjcmd VM.classloader_stats unloaded_class_countjmap