Java 工具集教程

jstat.exe 监视虚拟机统计信息

jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具,如:显示本地或者远程虚拟机进程中的类加载、内存、垃圾回收、JIT编译等运行时数据。

命令格式

jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

参数说明:

  • option  命令选项,用户可以通过指定不同的选项值查询不同的虚拟机信息,主要分为3类:类装载、垃圾回收和运行期编译状况,更多选项见后续“命令选项

  • -t  在输出的每行结果前面添加时间戳字段 Timestamp

  • -h  对输出结果进行分组,每隔 line 行就输出一次头信息

  • -J<flag> 将 <flag> 直接传递给运行时系统。 

  • vmid  虚拟机进程ID。如果是本地虚拟机进程,VMID 与 LVMID 是一致的。如果是远程虚拟机进程,那么 VMID 的格式如下:[protocol:] [//] lvmid[@hostname[:port]/serverName]

  • interval  表示两次查询之间的间隔

  • count  表示执行查询的次数

注意:如果省略 interval 和 count 两个参数,则 jstat 命令只查询一次。例如:

C:\Users\Administrator>jstat -gcutil 6064 500 10
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
 99.28   0.00  69.61  43.40  93.03  84.44     12    0.104     2    0.147    0.251
 99.28   0.00  73.75  43.40  93.03  84.44     12    0.104     2    0.147    0.251
 99.28   0.00  73.75  43.40  93.03  84.44     12    0.104     2    0.147    0.251
 99.28   0.00  73.75  43.40  93.03  84.44     12    0.104     2    0.147    0.251
 99.28   0.00  73.75  43.40  93.03  84.44     12    0.104     2    0.147    0.251
 99.28   0.00  73.75  43.40  93.03  84.44     12    0.104     2    0.147    0.251
 99.28   0.00  73.75  43.40  93.03  84.44     12    0.104     2    0.147    0.251
 99.28   0.00  73.96  43.40  93.03  84.44     12    0.104     2    0.147    0.251
 99.28   0.00  73.96  43.40  93.03  84.44     12    0.104     2    0.147    0.251
 99.28   0.00  73.96  43.40  93.03  84.44     12    0.104     2    0.147    0.251

上面表示 jstat 命令将每隔 500 毫秒查询一次 6064 进程的垃圾回收情况,一共查询 10 次。

命令选项

  • -class  监视类装载、卸载数量、总空间及类装载所耗费的时间

  • -gc  监视 Java 堆状况,包括 Eden 区、2 个 survivor 区、老年代、永久代等的容量、已用空间、GC时间合计等信息

  • -gccapacity  监视内容与 -gc 基本相同,但输出主要关注 Java 堆各个区域使用到的最大和最小空间

  • -gcutil  监视内容与 -gc 基本相同,但输出主要关注已使用空间占总空间的百分比

  • -gccause  与 -gcutil 功能一样,但是会额外输出导致上一次 GC 产生的原因

  • -gcnew  监视新生代 GC 的情况

  • -gcnewcapacity  监视内容与 -gcnew 基本相同,输出主要关注使用到的最大和最小空间

  • -gcold  监视老年代 GC 的状况

  • -gcoldcapacity  监视内容与 -gcold 基本相同,输出主要关注使用到的最大和最小空间

  • -gcpermcapacity  (JDK8一下版本可用)输出永久代使用到的最大和最小空间

  • -gcmetacapacity  (JDK8版本后可用)在 JDK8 中废弃了 PermGen 永久代,添加了元空间(Metaspace),使用该参数输出元空间使用到的最大和最小空间

  • -compiler  输出 JIT 编译器编译过的方法、耗时等信息

  • -printcompilation  输出已经被 JIT 编译的方法

命令示例

jstat -class 示例

监视进程 ID 为 6064 的 Java 进程类装载、卸载数量、总空间及类装载所耗费的时间。如下:

C:\Users\Administrator>jstat -class 6064
Loaded  Bytes  Unloaded  Bytes     Time
  5387 11283.5        0     0.0      13.37

上述的列分别代表:

  • Loaded:已加载的类的数量。

  • Bytes:已加载的类的总字节数。

  • Unloaded:已卸载的类的数量。

  • Bytes Unloaded:已卸载的类的总字节数。

  • Time:在类加载/卸载上花费的总时间。

这些信息对于理解 JVM 如何管理其类空间,以及可能存在的类加载和卸载问题非常有用。例如,如果您看到 Unloaded 的值始终为 0,而 Loaded 的值持续增长,那么可能表明您的应用程序正在加载大量类,但从未卸载它们,这可能会导致永久代(对于老版本的 JVM)或元空间(对于 Java 8 及更高版本)的内存泄漏。

jstat -gc 示例

调用 JVM 的 jstat 工具,查看 JVM 进程ID 为 6064 进程关于垃圾收集(GC)的统计信息。如下:

C:\Users\Administrator>jstat -gc 6064
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
3584.0 4608.0 3558.2  0.0   38912.0  29878.6   32256.0    13999.8   34816.0 32390.8 5120.0 4323.1     12    0.104   2      0.147    0.251

上述的列分别代表:

  • S0C 和 S1C:Survivor 0 和 Survivor 1 的容量(KB)。

  • S0U 和 S1U:Survivor 0 和 Survivor 1 的使用量(KB)。

  • EC::Eden 区的容量(KB)。

  • EU:Eden 区的使用量(KB)。

  • OC:Old 区的容量(KB)。

  • OU:Old 区的使用量(KB)。

  • MC:Metaspace(或 PermGen,取决于 JVM 版本)的容量(KB)。

  • MU:Metaspace(或 PermGen)的使用量(KB)。

  • CCSC:压缩类空间的容量(KB)。

  • CCSU:压缩类空间的使用量(KB)。

  • YGC:年轻代 GC 的次数。

  • YGCT:年轻代 GC 的总时间(秒)。

  • FGC:Full GC 的次数。

  • FGCT:Full GC 的总时间(秒)。

  • GCT:GC 的总时间(秒),即 YGCT + FGCT。

这些统计信息可以帮助你了解 JVM 的内存使用情况和垃圾收集性能,从而进行调优或诊断潜在的性能问题。

jstat -gccapacity 示例

该命令用于查看 Java 虚拟机(JVM)中指定 JVM 进程 ID 各个内存池的最大容量和当前已使用的空间。如下:

C:\Users\Administrator>jstat -gccapacity 6064
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
  8192.0  87040.0  48128.0 3584.0 4608.0  38912.0    16384.0   175104.0    32256.0    32256.0      0.0 1079296.0  34816.0      0.0 1048576.0   5120.0     12     2

上述的列分别代表:

  • NGCMN:新生代(Young Generation)的最小容量(KB)。

  • NGCMX:新生代(Young Generation)的最大容量(KB)。

  • NGC:当前新生代(Young Generation)的容量(KB)。

  • S0C:Survivor 0(S0)的当前容量(KB)。

  • S1C:Survivor 1(S1)的当前容量(KB)。

  • EC:Eden 区的当前容量(KB)。

  • OGCMN:老年代(Old Generation)的最小容量(KB)。

  • OGCMX:老年代(Old Generation)的最大容量(KB)。

  • OGC:当前老年代(Old Generation)的容量(KB)。

  • OC:方法区(通常是 Metaspace 或 PermGen,取决于 JVM 版本)的当前容量(KB)。

  • MCMN:方法区的最小容量(KB)。

  • MCMX:方法区的最大容量(KB)。

  • MC:当前方法区的容量(KB)。

  • CCSMN:压缩类空间(Compressed Class Space)的最小容量(KB,仅在某些 JVM 版本中可用)。

  • CCSMX:压缩类空间(Compressed Class Space)的最大容量(KB,仅在某些 JVM 版本中可用)。

  • CCSC:当前压缩类空间的容量(KB,仅在某些 JVM 版本中可用)。

  • YGC:年轻代垃圾收集(Young Generation GC)的次数。

  • FGC:完全垃圾收集(Full GC)的次数。

这些信息对于理解 JVM 内存池的配置和性能非常有用。你可以看到新生代和老年代的最大容量、当前容量,以及它们之间的相对大小。如果你注意到任何特定的内存池持续接近其最大容量,那么可能需要考虑调整 JVM 的内存设置或优化应用程序的内存使用。

jstat -gcutil 示例

该命令用于监视 Java 虚拟机(JVM)指定的进程 ID 的垃圾收集(GC)统计信息,并以百分比的形式显示内存池的使用情况和垃圾收集的时间。如下:

C:\Users\Administrator>jstat -gcutil 6064
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
 99.28   0.00  75.17  43.40  93.03  84.44     12    0.104     2    0.147    0.251

上述的列分别代表:

  • S0:Survivor 0(S0)区当前已使用的空间百分比。

  • S1:Survivor 1(S1)区当前已使用的空间百分比。

  • E:Eden 区当前已使用的空间百分比。

  • O:Old Generation(老年代)当前已使用的空间百分比。

  • M:Metaspace(元空间,Java 8 及更高版本)或 PermGen(永久代,Java 7 及更低版本)当前已使用的空间百分比。

  • CCS:Compressed Class Space(压缩类空间,某些 JVM 版本中可用)当前已使用的空间百分比。

  • YGC:从应用程序启动到采样时发生的年轻代垃圾收集(Young Generation GC)次数。

  • YGCT:年轻代垃圾收集所花费的总时间(秒)。

  • FGC:从应用程序启动到采样时发生的完全垃圾收集(Full GC)次数。

  • FGCT:完全垃圾收集所花费的总时间(秒)。

  • GCT:从应用程序启动到采样时垃圾收集所花费的总时间(秒),即 YGCT + FGCT。

这些百分比信息可以帮助你快速了解 JVM 内存池的使用情况,以及垃圾收集活动对应用程序性能的影响。例如,如果你看到 Eden 区或老年代的使用率接近 100%,这可能意味着需要调整堆内存的大小或优化应用程序的内存使用。同样,如果你看到完全垃圾收集(FGC)的次数或时间显著增加,这可能表明存在内存泄漏或其他需要关注的内存管理问题。

jstat -gccause 示例

该命令用于监视指定 Java 虚拟机(JVM)进程(通过进程ID <pid> 识别)的垃圾收集(GC)统计信息,并显示最后一次垃圾收集的原因。这个命令对于分析 JVM 的内存使用和垃圾收集行为特别有用。例如:

C:\Users\Administrator>jstat -gccause 6064
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC
 99.28   0.00  77.59  43.40  93.03  84.44     12    0.104     2    0.147    0.251 Allocation Failure   No GC

上述的列分别代表:

  • S0:Survivor 0(S0)区当前已使用的空间百分比。

  • S1:Survivor 1(S1)区当前已使用的空间百分比。

  • E:Eden 区当前已使用的空间百分比。

  • O:Old Generation(老年代)当前已使用的空间百分比。

  • M:Metaspace(元空间,Java 8 及更高版本)或 PermGen(永久代,Java 7 及更低版本)当前已使用的空间百分比。

  • CCS:Compressed Class Space(压缩类空间,某些 JVM 版本中可用)当前已使用的空间百分比(如果有的话)。

  • YGC:从应用程序启动到采样时发生的年轻代垃圾收集(Young Generation GC)次数。

  • YGCT:年轻代垃圾收集所花费的总时间(秒)。

  • FGC:从应用程序启动到采样时发生的完全垃圾收集(Full GC)次数。

  • FGCT:完全垃圾收集所花费的总时间(秒)。

  • GCT:从应用程序启动到采样时垃圾收集所花费的总时间(秒),即 YGCT + FGCT。

  • LGCC:表示上次GC的原因。

  • GCC:表示这次GC的原因。

上述的“GC Cause”列,该列指示了最近一次垃圾收集的原因。可能的原因包括:

  • Allocation Failure:内存分配失败导致 GC 被触发。这通常意味着 JVM 在尝试为对象分配内存时,新生代(Young Generation)或老年代(Old Generation)没有足够的空间,因此触发了垃圾收集。

  • Metadata GC Threshold:元空间(Metaspace)或永久代(PermGen)的内存分配请求导致 GC。这通常与类加载和卸载有关。

  • GC Locker Initiated GC:JVM 的某些内部操作(如 JNI 调用)需要确保没有其他线程同时进行 GC,因此会主动发起 GC。

  • Ergonomics:JVM 根据当前的堆使用情况、运行时间等自动决定进行 GC。这是 JVM 的默认行为,用于优化性能和内存使用。

  • 其他特定的原因:根据 JVM 的具体实现和配置,可能还有其他特定的原因触发 GC。

通过分析 jstat -gccause 命令的输出,你可以了解 JVM 的内存使用情况和垃圾收集行为,以及确定是否需要调整 JVM 的配置或优化应用程序的内存管理。

jstat -gcnew 示例

该命令用于监视指定 Java 虚拟机(JVM)进程(通过进程ID <pid> 识别)的年轻代(Young Generation)内存池的使用情况和垃圾收集(GC)统计信息。

年轻代是 JVM 堆内存中的一个区域,主要用于存放新创建的对象。它通常被分为三个子区域:一个 Eden 区和两个 Survivor 区(S0 和 S1)。当年轻代内存不足时,会触发 Minor GC(也称为 Young GC),尝试回收不再使用的对象并释放内存空间。例如:

C:\Users\Administrator>jstat -gcnew 6064
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
3584.0 4608.0 3558.2    0.0  2  15 4608.0  38912.0  30429.1     12    0.104

上述的列分别代表:

  • S0C:Survivor 0(S0)区当前容量(KB)。

  • S1C:Survivor 1(S1)区当前容量(KB)。

  • S0U:Survivor 0(S0)区已使用空间(KB)。

  • S1U:Survivor 1(S1)区已使用空间(KB)。

  • TT:Tenuring threshold(晋升阈值)。对象在 Survivor 区中存活超过这个阈值后,会被移动到老年代(Old Generation)。

  • MTT:Max tenuring threshold(最大晋升阈值)。这是 Tenuring threshold 的最大值,可以通过 JVM 参数 -XX:MaxTenuringThreshold 来设置。

  • DSS:Desired survivor size(期望的 Survivor 区大小,KB)。这是 JVM 尝试为 Survivor 区调整到的目标大小。

  • EC:Eden 区当前容量(KB)。

  • EU:Eden 区已使用空间(KB)。

  • YGC:从应用程序启动到采样时发生的年轻代垃圾收集(Young GC)次数。

  • YGCT:年轻代垃圾收集所花费的总时间(秒)。

通过分析 jstat -gcnew 命令的输出,你可以了解年轻代内存池的使用情况和垃圾收集活动的频率。如果你发现 Eden 区或 Survivor 区的使用率持续很高,或者年轻代垃圾收集的频率过高,那么可能需要考虑调整年轻代的大小、晋升阈值等参数,以优化应用程序的性能和内存使用。

jstat -gcnewcapacity 示例

该命令用于监视指定 Java 虚拟机(JVM)进程(通过进程ID <pid> 识别)的年轻代(Young Generation)内存池的容量及其相关统计信息。

年轻代是 JVM 堆内存中的一个区域,主要用于存放新创建的对象。它通常被分为三个子区域:一个 Eden 区和两个 Survivor 区(S0 和 S1)。当年轻代内存不足时,会触发 Minor GC(也称为 Young GC),尝试回收不再使用的对象并释放内存空间。例如:

C:\Users\Administrator>jstat -gcnewcapacity 6064
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC
    8192.0    87040.0    48128.0  28672.0   3584.0  28672.0   4608.0    86016.0    38912.0    12     2

上述的列分别代表:

  • NGCMN:年轻代(Young Generation)的最小容量(KB)。

  • NGCMX:年轻代(Young Generation)的最大容量(KB)。

  • NGC:当前年轻代(Young Generation)的容量(KB)。

  • S0CMX:年轻代中第一个 survivor 区的最大容量

  • S0C:年轻代中第一个 survivor 区的容量

  • S1CMX:年轻代中第二个 survivor 区的最大容量

  • S1C:年轻代中第二个 survivor 区的容量

  • ECMX:年轻代中 Eden 区的最大容量

  • EC:年轻代中 eden 区的容量

  • YGC:从应用程序启动到采样时发生的年轻代垃圾收集(Young GC)次数。

  • FGC:从应用程序启动到采样时发生的完全垃圾收集(Full GC)次数。这里列出 FGC 主要是为了提供上下文,尽管这个统计信息主要与老年代相关。

通过分析 jstat -gcnewcapacity 命令的输出,你可以了解年轻代内存池的当前容量、最大容量、最小容量,以及这些容量是如何随时间变化的。如果你发现年轻代的容量设置不合理,比如经常接近其最大容量,那么可能需要调整 JVM 的启动参数,如 -Xmn(设置年轻代的大小)或 -XX:SurvivorRatio(设置 Eden 区和 Survivor 区的比例),以优化年轻代的内存使用。

jstat -gcold 示例

该命令用于查看 Java 虚拟机中指定进程的老年代和元空间的垃圾回收统计信息。执行该命令后,它将输出老年代和元空间的相关统计数据,例如:

C:\Users\Administrator>jstat -gcold 6064
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT
 34816.0  32390.8   5120.0   4323.1     32256.0     13999.8     12     2    0.147    0.251

上述的列分别代表:

  • MC:元空间的容量,单位为 KB。

  • MU:元空间已使用大小,单位为 KB。

  • CCSC:压缩类空间(Compressed Class Space)当前容量(KB),仅在某些 JVM 版本中可用。

  • CCSU:压缩类空间(Compressed Class Space)已使用空间(KB),仅在某些 JVM 版本中可用。

  • OC:老年代的容量,单位为 KB。

  • OU:老年代已使用大小,单位为 KB。

  • YGC:Young GC(新生代垃圾回收)的次数。

  • FGC:Full GC(全量垃圾回收,包括老年代和元空间等)的次数。

  • FGCT:Full GC 的所用的时间。

  • GCT:从应用程序启动到采样时垃圾收集所花费的总时间(秒),即年轻代垃圾收集和完全垃圾收集的总时间。

通过分析 jstat -gcold 命令的输出,你可以了解老年代内存池的使用情况和垃圾收集活动的频率。如果你发现老年代的使用率持续很高,或者完全垃圾收集的频率过高,那么可能需要考虑调整 JVM 的堆大小、垃圾收集器类型或相关参数,以优化应用程序的性能和内存使用。

jstat -gcoldcapacity 示例

该命令用于监视 Java 虚拟机(JVM)中老年代(Old Generation)的内存容量统计信息。这个命令特别关注老年代的最小容量(Minimum Capacity)、最大容量(Maximum Capacity)以及当前容量(Current Capacity)。例如:

C:\Users\Administrator>jstat -gcoldcapacity 6064
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT
    16384.0    175104.0     32256.0     32256.0    12     2    0.147    0.251

上述的列分别代表:

  • OGCMN:老年代(Old Generation)的最小容量(KB)。这是老年代可以缩小的最小大小。

  • OGCMX:老年代(Old Generation)的最大容量(KB)。这是老年代可以增长到的最大大小。如果 JVM 启动了并且没有设置 -Xmx 参数(或设置得太小),或者老年代达到了其最大容量,则可能会触发 Full GC(也称为 Major GC)来尝试回收不再使用的对象。

  • OGC:当前老年代(Old Generation)的容量(KB)。这是老年代当前的已分配大小。

  • OC:老年代(Old Generation)的当前已使用空间(KB)。这表示老年代当前存储了多少数据。

  • YGC:从 JVM 启动到当前时间,年轻代(Young Generation)的 GC 次数。这个值通常作为上下文信息提供,因为它与老年代的容量变化没有直接的关系,但可以帮助你了解年轻代 GC 的频率。

  • FGC:从 JVM 启动到当前时间,老年代(Old Generation)或整个堆的 GC 次数(也称为 Full GC)。Full GC 通常会回收老年代中的对象,并可能导致应用程序的暂停。

  • FGCT:Full GC 花费的总时间(秒)。这个值表示所有 Full GC 的累计时间,可以帮助你了解 Full GC 对应用程序性能的影响。

  • GCT:从应用程序启动到采样时垃圾收集所花费的总时间(秒),即 YGCT + FGCT。

通过分析 jstat -gcoldcapacity 命令的输出,你可以了解老年代的容量配置以及它们随时间的变化情况。如果你发现老年代的当前使用量(OC)接近或达到其最大容量(OGCMX),并且 Full GC 的频率(FGC)或时间(FGCT)都很高,那么可能需要考虑调整 JVM 的堆大小设置(如 -Xms 和 -Xmx),或者优化应用程序以减少内存使用,以避免频繁的 Full GC 和潜在的性能问题。

jstat -gcmetacapacity 示例

该命令是 Java 虚拟机(JVM)提供的 jstat 工具的一个选项,用于监视 Java 8 及更高版本中元空间(Metaspace)的容量及其相关统计信息。在 Java 8 之前,JVM 使用永久代(PermGen)来存储类的元数据,但从 Java 8 开始,这个区域被元空间所取代,元空间是 Java 堆外的一块内存区域,使用本地内存。例如:

C:\Users\Administrator>jstat -gcmetacapacity 6064
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT
       0.0  1079296.0    34816.0        0.0  1048576.0     5120.0    12     2    0.147    0.251

上述的列分别代表:

  • MCMN:元空间(Metaspace)的最小容量(KB)。这是元空间可以缩小的最小大小。

  • MCMX:元空间(Metaspace)的最大容量(KB)。这是元空间可以增长到的最大大小。请注意,在某些配置下,这个值可能是“无限制”的,表示元空间可以使用尽可能多的本地内存。

  • MC:当前元空间(Metaspace)的容量(KB)。这是元空间当前的已分配大小。

  • CCSMN:压缩类空间(Compressed Class Space)的最小容量(KB)。这个空间用于存储类的元数据,如果 JVM 使用了压缩类指针(CompressedOops)特性,则会使用到它。

  • CCSMX:压缩类空间(Compressed Class Space)的最大容量(KB)。

  • CCSC:当前压缩类空间(Compressed Class Space)的容量(KB)。

  • YGC:从 JVM 启动到当前时间,年轻代(Young Generation)的 GC 次数。这个值通常作为上下文信息提供,因为它与元空间的容量变化没有直接的关系。

  • FGC:从 JVM 启动到当前时间,老年代(Old Generation)或整个堆的 GC 次数(也称为 Full GC)。同样,这个值通常作为上下文信息提供。

  • FGCT:Full GC 花费的总时间(秒)。这个值也通常作为上下文信息提供。

  • GCT:从应用程序启动到采样时垃圾收集所花费的总时间(秒),即 YGCT + FGCT。

通过分析 jstat -gcmetacapacity 命令的输出,你可以了解元空间和压缩类空间的容量配置以及它们随时间的变化情况。如果你发现元空间的使用量持续增长,并且接近或超过其最大容量,可能需要考虑调整元空间的配置参数(如 -XX:MaxMetaspaceSize),以避免潜在的 OutOfMemoryError。同样,如果压缩类空间的使用量也持续增长,可能需要关注类加载和卸载的行为,以及是否有类加载器泄漏等问题。

jstat -compiler 示例

该命令是 Java 虚拟机(JVM)提供的 jstat 工具的一个选项,用于监视 HotSpot JVM 的即时(Just-In-Time, JIT)编译器的统计信息。这个命令提供了关于 JIT 编译器如何执行其任务的详细信息,包括编译的触发条件、方法编译的速率等。例如:

C:\Users\Administrator>jstat -compiler 6064
Compiled Failed Invalid   Time   FailedType FailedMethod
    3401      0       0     5.94          0

上述的列分别代表:

  • Compiled:从 JVM 启动开始,已经被 JIT 编译器编译的方法数量。这个计数器会随着时间的推移而增加,表示越来越多的方法被编译成了本地代码。

  • Failed:编译失败的方法数量。这通常表示有些方法因为某些原因(如代码优化失败、编译资源不足等)而无法被编译成本地代码。

  • Invalid:被无效化的已编译方法的数量。当方法被无效化时,其编译后的本地代码会被丢弃,并且方法将再次被解释执行或重新编译。无效化通常发生在类被重新定义(例如,通过热代码替换)时。

  • Time:最近一次编译所花费的时间(秒)。这表示从提交编译请求到编译完成所经过的时间。

  • FailedType 和 FailedMethod(如果存在):在某些版本的 JVM 中,如果编译失败,jstat -compiler 可能会显示失败的类型(FailedType)和失败的方法(FailedMethod)的详细信息。这有助于诊断为什么某些方法无法被编译。

使用 jstat -compiler 命令可以帮助你了解 JIT 编译器的性能和行为。通过分析编译的统计信息,你可以确定是否有大量的方法正在被编译(这可能会消耗 CPU 资源),以及是否有编译失败或无效化的情况发生(这可能会影响应用程序的性能)。这些信息对于优化 JVM 的性能和调试与 JIT 编译器相关的问题都非常有用。

jstat -printcompilation 示例

该命令是 Java 虚拟机(JVM)提供的 jstat 工具的一个选项,用于监视 HotSpot JVM 的即时(Just-In-Time, JIT)编译器的行为。这个命令可以显示哪些方法已经被 JIT 编译器编译成了本地代码,以及编译的触发原因和耗费的时间等信息。例如:

C:\Users\Administrator>jstat -printcompilation 6064
Compiled  Size  Type Method
    3413     54    1 org/openide/util/RequestProcessor$TickTac cancelImpl

上述的列分别代表:

  • Compiled:从 JVM 启动开始,已经被 JIT 编译器编译的方法数量。

  • Size:JIT 编译器代码缓存的大小(KB)。

  • Type:编译类型。这可以是以下几种之一:

    • nmethod:表示这是一个普通的编译方法。

    • stub:表示这是一个桩(stub)方法,通常用于处理某些特殊的操作,如调用本地方法(native method)或处理异常。

    • opt:表示这是一个优化后的方法。

    • adapter:表示这是一个适配器(adapter)方法,用于桥接不同的方法签名或进行参数类型转换。

  • Method:被编译的方法的全名(包括类名、方法名和描述符)。

此外,该命令的输出还可能包含一些额外的列,具体取决于 JVM 的版本和配置。例如,在一些版本的 JVM 中,你可能会看到 Loaded 列,表示从 JVM 启动开始已经加载到 JVM 中的类的数量。

使用该命令可以帮助你了解 JIT 编译器的行为,包括哪些方法被编译了、编译的触发原因以及编译所花费的时间等。这对于优化 JVM 的性能和调试与 JIT 编译器相关的问题都非常有用。

需要注意的是,该命令的输出是动态更新的,因此你可以通过多次运行这个命令来观察 JIT 编译器的行为随时间的变化。同时,由于 JIT 编译器的行为可能会受到多种因素的影响(如 JVM 的配置、代码的运行模式等),因此你需要结合实际情况来分析和解释这个命令的输出。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号