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 名称。
希望对您有所帮助。
在 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 名称。
希望对您有所帮助。