咨询jmap -histo pid命令的具体输出内容及含义
嘿,我来给你把jmap -histo <pid>的输出拆解明白,你贴的示例里每一项的含义都给你讲清楚:
表头各列含义
- num:输出的排序序号,结果是按类的总内存占用从高到低排列的
- #instances:该类当前存在的实例总数
- #bytes:该类所有实例占用的总内存字节数(注意是总大小,不是单个实例的内存)
- class name:类的名称,这里有不少JVM内部的特殊格式,下面单独给你解释
特殊类名解析
你看到的那些带括号或尖括号的类名,要么是数组类型,要么是JVM用来管理元数据的内部类:
[C:对应Java里的char[](字符数组),通常和java.lang.String绑定出现,因为String内部就是用它来存储字符的,这个占内存高是很常见的情况[B:对应byte[](字节数组),常用于存储二进制数据、IO缓冲区、序列化内容等场景<constMethodKlass>、<methodKlass>:HotSpot虚拟机的内部元数据类,分别用来存储方法的常量信息、方法本身的结构定义<constantPoolKlass>:存储类的常量池元数据,每个类都有自己的常量池,用来存放字符串常量、符号引用这些内容<instanceKlassKlass>:描述普通实例类的元类,简单说就是“类的类”,JVM靠它来管理类的结构信息[I:对应int[](整数数组)java.lang.String:就是我们日常用的字符串类,实例数高说明你的程序里创建了大量字符串对象,可能要留意有没有重复创建、未及时回收的情况
小技巧补充
如果加上:live参数(jmap -histo:live <pid>),命令会先触发一次Full GC,只统计存活的对象,这样能更精准地定位内存中真正在被使用的对象,排查内存泄漏时特别有用。
内容的提问来源于stack exchange,提问作者Pwnstar
相关产品推荐
相关产品推荐

