代码之家  ›  专栏  ›  技术社区  ›  Naruto Biju Mode

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

  •  4
  • Naruto Biju Mode  · 技术社区  · 7 年前

    在使用Oracle JDK 100.1-64位的Ubuntu My.18.04-64位上使用JMAP时,该工具只在将目标和工具作为根运行时使用,但是使用相同的正常用户运行两个错误:

    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)
    

    使用根用户运行以下命令时

    jmap -clstats <pid>
    

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

    1 回复  |  直到 7 年前
        1
  •  5
  •   AreSo    7 年前

    通过运行这个命令,可以期望与类加载器相关的输出,但是它在jdk8中被修改为打印 jcmd {pid} GC.class_stats 命令。一些细节可以在 JDK-8010507 JDK-8195682 问题。

    至于输出-没有更多的文件比 this one 。在openjdk vm源代码中可以找到一些描述, heapInspection.cpp 文件。我觉得这个输出不太有用,但是这里有一些解释(基于这个头的描述,和 Java class format description ):

    • 索引: 这个类的索引。
    • 超级的: 超级类索引。如果-1,则不存在超级类(例如发生在数组类型中)
    • InstBytes: 类的所有实例占用的字节数(字节)。
    • KlassBytes: 类本身占用的字节数(字节)。(此类的InstanceKlass或ArrayClass的大小。)
    • 注释: 所有注释的大小(以字节为单位)
    • CpAll: 常量池各部分的大小(cp+cptags+cpcache+cpoperands+cprefmap之和)
    • MethodCount: 此类中的数字方法(包括构造函数)
    • Bytecodes: 类中字节码命令占用的大小
    • 方法所有 方法及其元数据占用的所有空间之和(MultByth+SistaMe+StAcMeP+方法数据)
    • ROAll: (可能)放置在只读内存中的所有类元数据的大小。(这可能会随着 CDS design )
    • RWAll: 必须放置在读/写存储器中的所有类元数据的大小。(这可能会随着 光盘设计 )
    • 总数: 漫游+漫游。注意,这不包括instbytes(因此实例不占用空间)
    • ClassName: 完全限定类名。

    希望有帮助。