jmap 工具仅作为 root 和输出列不明确

jmap tool works only as root and output columns are not clear

在 Ubuntu Mate 18.04-64 位与 Oracle JDK 10.0.1-64 位上使用 jmap,该工具仅在 运行 以 root 身份同时连接目标和工具时才有效,但是对 运行ning 使用相同的普通用户会出现以下错误:

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 and JDK-8195682 个问题中找到一些详细信息。

至于输出——没有比this one. Some description can be found in OpenJDK VM source code, heapInspection.cpp file. I don't find this output too useful, but here some explanation (based on description from this header, and Java class format description更多的文档了):

  • 索引: 这个 class.
  • 的索引
  • 超级: 超级 class 的索引。如果 -1,则没有 super class(例如数组类型)
  • InstBytes: class 的所有实例占用的字节数(以字节为单位)。
  • KlassBytes: class 本身占用的字节数(以字节为单位)。 (此 class 的 InstanceKlass 或 ArrayKlass 的大小。)
  • 注释:所有注释的大小(以字节为单位)
  • CpAll: Constants Pool 所有部分的大小(Cp + CpTags + CpCache + CpOperands + CpRefMap)
  • MethodCount: 这个 class 中的方法数(包括构造函数)
  • 字节码: class
  • 中字节码命令占用的大小
  • MethodAll:方法及其元数据(MethodBytes + Constmethod + Stackmap + Methoddata)占用的所有space总和
  • ROAll: 可以(可能)放置在只读存储器中的所有 class 元数据的大小。 (这可能会因 CDS design 而改变)
  • RWAll: 必须放置在 read/write 内存中的所有 class 元数据的大小。 (这可能会因 CDS design 而改变)
  • 总计: ROAll + RWAll。请注意,这不包括 InstBytes(因此没有 space 实例占用)
  • 类名: 完全限定的 class 名称。

希望对您有所帮助。