JDK14性能管理工具jstat使用介绍

49次阅读

共计 8213 个字符,预计需要花费 21 分钟才能阅读完成。

简介

作为一个程序员,经常会为如何定位 java 程序的问题或者去调优 JVM 性能而苦恼不已。也许你听过一些 java 的 profile 的强力工具,比如 jprofile。但是这些工具大部分都是要收费的,对于我们个人程序员来说十分不友好。

其实 JDK 已经自带了很多优秀的性能调优工具,你可以在 JAVA_HOME/bin 中找到他们。

更多精彩内容且看:

  • 区块链从入门到放弃系列教程 - 涵盖密码学, 超级账本, 以太坊,Libra, 比特币等持续更新
  • Spring Boot 2.X 系列教程: 七天从无到有掌握 Spring Boot- 持续更新
  • Spring 5.X 系列教程: 满足你对 Spring5 的一切想象 - 持续更新
  • java 程序员从小工到专家成神之路(2020 版)- 持续更新中, 附详细文章教程

更多内容请访问 www.flydean.com

今天我们的系列文章要介绍的是这四个工具:

  1. Jstat(sun.tools.jstat) 它的全称是 Java Virtual Machine Statistics Monitoring Tool,是用来监控 JVM 状态的工具。
  2. jstack(sun.tools.jstack) 它的全称是 Java Stack Trace,是用来做 java 栈的跟踪工具。
  3. jmap(sun.tools.jmap) 它的全称是 Java Memory Map,是 java 的内存管理工具。
  4. jhat (com.sun.tools.hat.Main) 它的全称是 Java Heap Analyse Tool,是 java 的堆分析工具。

有了这四个工具,基本上 JVM 运行期间的方方面面都可以被覆盖到了。下面我们将具体对每一个工具进行详细讲解。本文将会首先讲解 Jstat 的具体使用。

JStat 命令

jstat 主要对 JVM 运行期间的各种参数进行收集,包括查看类的加载情况,jc 中新生代老年代元数据空间的使用情况等。

先看下 Jstat 的命令:

jstat outputOptions [-t] [-h lines] vmid [interval [count]]
  • outputOptions – 选择需要输出哪些内容
  • t – 在第一列输出 timestamp, 是从目标 JVM 启动时候开始算起
  • h – 选择每隔 n 行输出列的名字,默认是 0,表示只在第一行输出列的名字
  • vmid – JVM 的 pid,可以使用 jps 来查看
  • interval – jstat 输出的时间间隔默认单位是毫秒
  • count – 表示需要展示多少取样数据,默认是无限制的,表示会一直取样输出,直到 JVM 停止

JStat Output Options

上面我们讲了 JStat 命令的基本格式,在本节我们会详细讲解 JStat 的输出选项。

使用 jstat -options 可以看到 jstat 支持的几个 options 选项:

jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation

class

输出 class loader 的统计信息,我们举个例子:

jstat -class -t 53528 100 5
Timestamp       Loaded  Bytes  Unloaded  Bytes     Time
        19822.8   5214 10752.5        0     0.0       2.91
        19823.0   5214 10752.5        0     0.0       2.91
        19823.0   5214 10752.5        0     0.0       2.91
        19823.2   5214 10752.5        0     0.0       2.91
        19823.2   5214 10752.5        0     0.0       2.91

上面的例子中 53528 是目标 JVM 的 pid,100 表示取样的间隔时间是 100ms,5 表示最后只展示 5 条数据。

上面的 Timestamp 表示的 JVM 的启动的时间。

  • Loaded – 有多少个 class 被加载
  • Bytes – 被加载的 class 大小
  • Unloaded – 多少 class 被反加载
  • Bytes – 反加载的 class 大小
  • Time – 加载和反加载 class 花费的时间

compiler

compiler 统计的是 Java HotSpot VM Just-in-Time JIT 即时编译器的信息。

JIT 即时编译器是为了提升代码的执行速度而产生的。JVM 对于一些热点代码,比如多次循环和经常使用的方法。对于这些热点代码,JIT 会将其编译成机器代码,从而提升执行速度。

还是举刚刚的 JVM 的例子:

jstat -compiler 53528 100 5
Compiled Failed Invalid   Time   FailedType FailedMethod
    2675      0       0     5.35          0
    2675      0       0     5.35          0
    2675      0       0     5.35          0
    2675      0       0     5.35          0
    2675      0       0     5.35          0
  • Compiled – 执行的编译任务的次数
  • Failed – 编译任务失败次数
  • Invalid – 置位无效的编译任务次数
  • Time – 执行编译任务花费的时间
  • FailedType – 上一次失败编译的编译类型
  • FailedMethod – 上一次编译失败的方法名

gc

gc 统计的是 gc heap 信息

jstat -gc 53528 100 5
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT
 0.0   4096.0  0.0   3978.2 56320.0  33792.0   15360.0    15215.0   21552.0 20680.9 2688.0 2468.0      4    0.025   0      0.000   2      0.003    0.028
 0.0   4096.0  0.0   3978.2 56320.0  33792.0   15360.0    15215.0   21552.0 20680.9 2688.0 2468.0      4    0.025   0      0.000   2      0.003    0.028
 0.0   4096.0  0.0   3978.2 56320.0  33792.0   15360.0    15215.0   21552.0 20680.9 2688.0 2468.0      4    0.025   0      0.000   2      0.003    0.028
 0.0   4096.0  0.0   3978.2 56320.0  33792.0   15360.0    15215.0   21552.0 20680.9 2688.0 2468.0      4    0.025   0      0.000   2      0.003    0.028
 0.0   4096.0  0.0   3978.2 56320.0  33792.0   15360.0    15215.0   21552.0 20680.9 2688.0 2468.0      4    0.025   0      0.000   2      0.003    0.028

gc 的输出参数比较多,我们一一进行解释,这样大家对于 gc 的运行内核会有更多的理解:

  • S0C – survivor 0 区域的容量,以 KB 为单位
  • S1C – survivor 1 区域的容量,以 KB 为单位

Young Gen 被划分为 1 个 Eden Space 和 2 个 Suvivor Space。当对象刚刚被创建的时候,是放在 Eden space。垃圾回收的时候,会扫描 Eden Space 和一个 Suvivor Space。如果在垃圾回收的时候发现 Eden Space 中的对象仍然有效,则会将其复制到另外一个 Suvivor Space。

就这样不断的扫描,最后经过多次扫描发现任然有效的对象会被放入 Old Gen 表示其生命周期比较长,可以减少垃圾回收时间。

  • S0U – survivor 0 区域的使用大小,以 KB 为单位
  • S1U – survivor 1 区域的使用大小,以 KB 为单位
  • EC – Eden 区域的容量,以 KB 为单位
  • EU – Eden 区域的使用,以 KB 为单位
  • OC – old 区域的容量,以 KB 为单位
  • OU – old 区域的使用,以 KB 为单位
  • MC – Metaspace 元数据区的 Committed Size,以 KB 为单位
  • MU – Metaspace 元数据区的使用大小,以 KB 为单位

在 JDK8 之前,类定义、字节码和常量等很少会变更的信息是放在持久代 Perm Gen 中的。不过在 JDK8 之后,Perm Gen 已经被取消了,现在叫做 Metaspace。Metaspace 并不在 java 虚拟机中,它使用的是本地内存。Metaspace 可以通过 -XX:MaxMetaspaceSize 来控制。

  • CCSC – Compressed class 的 Committed Size,以 KB 为单位
  • CCSU – Compressed class 的使用大小,以 KB 为单位

Compressed Class Space,它是和 -XX:+UseCompressedOops,-XX:+UseCompressedClassesPointers 有关的。实际上是一个指针的压缩,可以使用 32bits 来表示之前 64bits 的指针。

  • YGC – young generation 的 GC 次数
  • YGCT – young generation 的 GC 时间
  • FGC – full GC 的次数
  • FGCT – full GC 的时间
  • GCT – 总的 GC 时间

gccapacity

gccapacity 统计的是内存池的创建和大小等统计信息

jstat -gccapacity 53528 100 5
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC   CGC
     0.0 716800.0  60416.0    0.0 4096.0  56320.0        0.0   716800.0    15360.0    15360.0      0.0 1069056.0  21552.0      0.0 1048576.0   2688.0      4     0     2
     0.0 716800.0  60416.0    0.0 4096.0  56320.0        0.0   716800.0    15360.0    15360.0      0.0 1069056.0  21552.0      0.0 1048576.0   2688.0      4     0     2
     0.0 716800.0  60416.0    0.0 4096.0  56320.0        0.0   716800.0    15360.0    15360.0      0.0 1069056.0  21552.0      0.0 1048576.0   2688.0      4     0     2
     0.0 716800.0  60416.0    0.0 4096.0  56320.0        0.0   716800.0    15360.0    15360.0      0.0 1069056.0  21552.0      0.0 1048576.0   2688.0      4     0     2
     0.0 716800.0  60416.0    0.0 4096.0  56320.0        0.0   716800.0    15360.0    15360.0      0.0 1069056.0  21552.0      0.0 1048576.0   2688.0      4     0     2
  • NGCMN – 最小的新生代的大小
  • NGCMX – 最大的新生代大小
  • NGC – 目前新生代的大小
  • S0C – survivor 0 区域的容量
  • S1C – survivor 1 区域的容量
  • EC – Eden 区域的容量
  • OGCMN – 最小 old 代大小
  • OGCMX – 最大 old 代大小
  • OGC – 目前 old 代大小
  • OC – 目前 old space 大小
  • MCMN – 最小 metaspace 大小
  • MCMX – 最大 metaspace 大小
  • MC – Metaspace 元数据区的 Committed Size
  • CCSMN – Compressed class 空间的最小容量
  • CCSMX – Compressed class 空间的最大容量
  • CCSC – Compressed class 的 Committed Size
  • YGC – young generation 的 GC 次数
  • FGC – full GC 的次数

gcnew

gcnew 表示新生代的统计信息

jstat -gcnew 53528 100 5
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
   0.0 4096.0    0.0 3978.2 15  15 5120.0  56320.0  33792.0      4    0.025
   0.0 4096.0    0.0 3978.2 15  15 5120.0  56320.0  33792.0      4    0.025
   0.0 4096.0    0.0 3978.2 15  15 5120.0  56320.0  33792.0      4    0.025
   0.0 4096.0    0.0 3978.2 15  15 5120.0  56320.0  33792.0      4    0.025
   0.0 4096.0    0.0 3978.2 15  15 5120.0  56320.0  33792.0      4    0.025
  • S0C – survivor 0 区域的容量
  • S1C – survivor 1 区域的容量
  • S0U – survivor 0 区域的使用大小,以 KB 为单位
  • S1U – survivor 1 区域的使用大小,以 KB 为单位
  • TT – Tenuring threshold(进入老年代的阈值?)
  • MTT – 最大的 Tenuring threshold
  • DSS – 所需的 survivor size
  • EC – Eden 区域的容量
  • EU – Eden 区域的使用,以 KB 为单位
  • YGC – 新生代 GC 次数
  • YGCT – 新生代 GC 所需的时间

gcnewcapacity

gcnewcapacity 统计的是新生代的指标,和 gccapacity 的结果是很类似的:

jstat -gcnewcapacity 53528 100 5
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC   CGC
       0.0   716800.0    60416.0      0.0      0.0 716800.0   4096.0   716800.0    56320.0     4     0     2
       0.0   716800.0    60416.0      0.0      0.0 716800.0   4096.0   716800.0    56320.0     4     0     2
       0.0   716800.0    60416.0      0.0      0.0 716800.0   4096.0   716800.0    56320.0     4     0     2
       0.0   716800.0    60416.0      0.0      0.0 716800.0   4096.0   716800.0    56320.0     4     0     2
       0.0   716800.0    60416.0      0.0      0.0 716800.0   4096.0   716800.0    56320.0     4     0     2
  • NGCMN – 最小的新生代的大小
  • NGCMX – 最大的新生代大小
  • NGC – 目前新生代的大小
  • S0CMX – survivor 0 区域容量的最大值
  • S0C – survivor 0 区域的容量
  • S1CMX – survivor 1 区域容量的最大值
  • S1C – survivor 1 区域的容量
  • EC – Eden 区域的容量
  • ECMX – Eden 区域容量的最大值
  • YGC – young generation 的 GC 次数
  • FGC – full GC 的次数

gcold

gcold 统计 old 代的信息

jstat -gcold 53528 100 5
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT    CGC    CGCT     GCT
 21552.0  20680.9   2688.0   2468.0     15360.0     15215.0      4     0    0.000     2    0.003    0.028
 21552.0  20680.9   2688.0   2468.0     15360.0     15215.0      4     0    0.000     2    0.003    0.028
 21552.0  20680.9   2688.0   2468.0     15360.0     15215.0      4     0    0.000     2    0.003    0.028
 21552.0  20680.9   2688.0   2468.0     15360.0     15215.0      4     0    0.000     2    0.003    0.028
 21552.0  20680.9   2688.0   2468.0     15360.0     15215.0      4     0    0.000     2    0.003    0.028

结果的几项指标前面已经介绍过了,这里就不再重复了

gcoldcapacity

gcoldcapacity 表示 old 代的容量信息

jstat -gcoldcapacity 53528 100 5
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT    CGC    CGCT     GCT
        0.0    716800.0     15360.0     15360.0     4     0    0.000     2    0.003    0.028
        0.0    716800.0     15360.0     15360.0     4     0    0.000     2    0.003    0.028
        0.0    716800.0     15360.0     15360.0     4     0    0.000     2    0.003    0.028
        0.0    716800.0     15360.0     15360.0     4     0    0.000     2    0.003    0.028
        0.0    716800.0     15360.0     15360.0     4     0    0.000     2    0.003    0.028

gcmetacapacity

gcmetacapacity 统计的是元数据区域的容量信息

jstat -gcmetacapacity 53528 100 5
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT    CGC    CGCT     GCT
       0.0  1069056.0    21552.0        0.0  1048576.0     2688.0     4     0    0.000     2    0.003    0.028
       0.0  1069056.0    21552.0        0.0  1048576.0     2688.0     4     0    0.000     2    0.003    0.028
       0.0  1069056.0    21552.0        0.0  1048576.0     2688.0     4     0    0.000     2    0.003    0.028
       0.0  1069056.0    21552.0        0.0  1048576.0     2688.0     4     0    0.000     2    0.003    0.028
       0.0  1069056.0    21552.0        0.0  1048576.0     2688.0     4     0    0.000     2    0.003    0.028

gcutil

gcutil 统计的是 GC 总体的情况

jstat -gcutil 53528 100 5
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028
  • S0 – S0 区域的使用比例
  • S1 – S1 区域的使用比例
  • E – Eden 区域的使用比例
  • O – Old 区域的使用比例
  • M – 元数据区域的使用比例
  • CCS – Compressed class 空间的使用比例

gccause

gccause 和 gcutil 非常相识,只不过多了下面两列:

  • LGCC – 上次 GC 的原因
  • GCC – 当前 GC 的原因
jstat -gccause 53528 100 5
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT    LGCC                 GCC
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028 Metadata GC Threshold No GC
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028 Metadata GC Threshold No GC
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028 Metadata GC Threshold No GC
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028 Metadata GC Threshold No GC
  0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.028 Metadata GC Threshold No GC

printcompilation

printcompilation 是 JVM 编译器的方法统计

jstat -printcompilation 53528 100 5
Compiled  Size  Type Method
    2675     23    1 jdk/internal/misc/InnocuousThread eraseThreadLocals
    2675     23    1 jdk/internal/misc/InnocuousThread eraseThreadLocals
    2675     23    1 jdk/internal/misc/InnocuousThread eraseThreadLocals
    2675     23    1 jdk/internal/misc/InnocuousThread eraseThreadLocals
    2675     23    1 jdk/internal/misc/InnocuousThread eraseThreadLocals
  • Compiled – 最近执行的编译任务次数
  • Size – 最近编译方法的大小
  • Type – 最新编译方法的类型
  • Method – 最新编译方法的名字

总结

本文介绍了 JDK14 中自带的 jstat JVM 分析工具,希望大家能够在实际的工作中用到。

本文作者:flydean 程序那些事

本文链接:http://www.flydean.com/jdk14-jvm-jstat/

本文来源:flydean 的博客

欢迎关注我的公众号: 程序那些事,更多精彩等着您!

正文完
 0