jmap工具仅在根和输出列不清楚时起作用

时间:2018-06-22 11:15:41

标签: java jmap

在Ubuntu Mate 18.04-64bits和Oracle JDK 10.0.1-64bits上使用jmap时,该工具仅在同时以root身份运行目标和工具时有效,但是使用同一普通用户运行这两个工具会出现以下错误: / p>

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>

一切正常,但是我发现理解输出列的含义有些困难: enter image description here 是否有任何官方文档解释每列的含义?

1 个答案:

答案 0 :(得分:4)

通过运行此命令,可以预期与ClassLoaders相关的输出,但是在JDK8中对其进行了修改,以显示jcmd {pid} GC.class_stats命令的结果。一些详细信息可以在JDK-8010507JDK-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:完全限定的类名称。

希望有帮助。