在使用Oracle JDK 10.0.1-64bits的Ubuntu Mate 18.04-64bits上使用jmap时,该工具仅在以root身份运行目标和工具时才有效,但使用相同的普通用户运行两者都会产生以下错误:
Exception in thread "main" com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file /proc/13538/cwd/.attach_pid13538: target process 13538 doesn't respond within 10500ms or HotSpot VM not loaded
at jdk.attach/sun.tools.attach.VirtualMachineImpl.<init>(VirtualMachineImpl.java:103)
at jdk.attach/sun.tools.attach.AttachProviderImpl.attachVirtualMachine(AttachProviderImpl.java:58)
at jdk.attach/com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:207)
at jdk.jcmd/sun.tools.jmap.JMap.executeCommandForPid(JMap.java:124)
at jdk.jcmd/sun.tools.jmap.JMap.main(JMap.java:114)
使用root用户运行以下命令时
jmap -clstats <pid>
一切正常但我发现有些困难要理解输出列的含义:
是否有任何官方文档解释每列的含义?
解决方法:
通过运行此命令,可以预期与ClassLoaders相关的输出,但它在JDK8中被修改为打印jcmd {pid} GC.class_stats命令的结果.一些细节可以在JDK-8010507和JDK-8195682问题中找到.
至于输出 – 没有比this one更多的文档.一些描述可以在OpenJDK VM源代码,heapInspection.cpp文件中找到.我没有发现这个输出太有用,但这里有一些解释(基于此标题的描述,以及Java class format description):
>索引:此类的索引.
>超级:超级指数.如果为-1,则没有超类(例如对于数组类型)
> InstBytes:类的所有实例占用的字节数(以字节为单位).
> KlassBytes:类本身占用的字节数(以字节为单位). (此类的InstanceKlass或ArrayKlass的大小.)
>注释:所有注释的大小(以字节为单位)
> CpAll:常量池的所有部分的大小(Cp CpTags的总和CpCache CpOperands CpRefMap)
> MethodCount:此类中的数字方法(包括构造函数)
>字节码:类中字节码命令占用的大小
> MethodAll:方法及其元数据占用的所有空间的总和(MethodBytes Constmethod Stackmap Methoddata)
> ROAll:可能(可能)放置在只读内存中的所有类元数据的大小. (这可能会随着CDS design而改变)
> RWAll:必须放在读/写内存中的所有类元数据的大小. (这可能会随着CDS design而改变)
>总计:ROAll RWAll.请注意,这不包括InstBytes(因此实例不占用空间)
> ClassName:完全限定的类名.
希望能帮助到你.