JVM(7):虚拟机性能分析和故障解决工具之jstat工具

1 jstat(JVM Statistics Monitoring Tool)作用

监视虚拟机各种运行状态信息,可以显示本地或者是远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据

2 命令格式

jstat [options vmid [interval[count]]]

参数解释

第一个参数:options

代表用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集和运行期编译状况,具体选项及作用如下:

  • -class:显示有关类加载器行为的统计信息
  • -compiler:显示有关Java HotSpot VM即时编译器行为的统计信息
  • -gc:显示有关垃圾收集堆行为的统计信息
  • -gccapacity:显示有关各个垃圾回收代容量及其相应空间的统计信息
  • -gccause:显示有关垃圾收集统计信息(同-gcutil),以及上一次和当前(如果适用)垃圾收集事件的原因
  • -gcnew:显示新生代行为的统计信息
  • -gcnewcapacity:显示有关新生代大小及其相应空间的统计信息
  • -gcold:显示有关老年代行为的统计信息和元空间统计信息
  • -gcoldcapacity:显示有关老年代大小的统计信息
  • -gcmetacapacity:显示有关元空间大小的统计信息
  • -gcutil:显示有关垃圾收集统计信息
  • -printcompilation:显示Java HotSpot VM编译方法统计信息

第二个参数:vmid

如果是本地虚拟机进程,vmid和本地虚拟机唯一ID是一致的

如果是远程虚拟机进程,那vmid的格式应当是:

[protocol:][//]lvmid[@hostname[:port]/servername]

第三个参数:interval

采样间隔,单位为秒(s)或毫秒(ms)

默认单位是毫秒。必须为正整数。

指定后,该jstat命令将在每个间隔产生其输出

第四个参数:count

要显示的样本数

3 案例

package com.example.demo;

import java.io.IOException;


/*
    -class选项:类加载器统计信息
        Loaded:已加载的类数
        Bytes:加载的kB数
        Unloaded:卸载的类数
        Bytes:卸载的KB数

        Time:执行类加载和卸载操作所花费的时间

    -compiler选项:Java HotSpot VM即时编译器统计信息
        Compiled:执行的编译任务数
        Failed:编译任务数失败
        Invalid:无效的编译任务数
        Time:执行编译任务所花费的时间
        FailedType:上次失败的编译的编译类型
        FailedMethod:上次失败的编译的类名和方法


 */
public class jstatdemo {
    public static void main(String[] args) throws IOException {
        System.out.println("jstat");
        System.in.read();
    }
}

参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次:

查询一次进程14148垃圾收集情况:

jstat –gc 14148

假设需要每250毫秒查询一次进程8888垃圾收集情况,一共查询10次,那命令应当是:

jstat –gc 8888 250 10

常见统计选项演示:

-class选项:

类加载器统计信息:

  • Loaded:已加载的类数
  • Bytes:加载的kB数
  • Unloaded:卸载的类数
  • Bytes:卸载的KB数
  • Time:执行类加载和卸载操作所花费的时间

代码如下:

package com.example.demo;

import java.io.IOException;


/*
    -class选项:类加载器统计信息
        Loaded:已加载的类数
        Bytes:加载的kB数
        Unloaded:卸载的类数
        Bytes:卸载的KB数

        Time:执行类加载和卸载操作所花费的时间

    -compiler选项:Java HotSpot VM即时编译器统计信息
        Compiled:执行的编译任务数
        Failed:编译任务数失败
        Invalid:无效的编译任务数
        Time:执行编译任务所花费的时间
        FailedType:上次失败的编译的编译类型
        FailedMethod:上次失败的编译的类名和方法


 */
public class jstatdemo {
    public static void main(String[] args) throws IOException {
        System.out.println("jstat");
        System.in.read();
    }
}

启动后,使用命令查看

jstat -class 14148

-compiler选项:

Java HotSpot VM即时编译器统计信息:

  • Compiled:执行的编译任务数
  • Failed:编译任务数失败
  • Invalid:无效的编译任务数
  • Time:执行编译任务所花费的时间
  • FailedType:上次失败的编译的编译类型
  • FailedMethod:上次失败的编译的类名和方法

代码如下:

package com.example.demo;

import java.io.IOException;


/*
    -class选项:类加载器统计信息
        Loaded:已加载的类数
        Bytes:加载的kB数
        Unloaded:卸载的类数
        Bytes:卸载的KB数

        Time:执行类加载和卸载操作所花费的时间

    -compiler选项:Java HotSpot VM即时编译器统计信息
        Compiled:执行的编译任务数
        Failed:编译任务数失败
        Invalid:无效的编译任务数
        Time:执行编译任务所花费的时间
        FailedType:上次失败的编译的编译类型
        FailedMethod:上次失败的编译的类名和方法


 */
public class jstatdemo {
    public static void main(String[] args) throws IOException {
        System.out.println("jstat");
        System.in.read();
    }
}

启动后,使用命令查看

jstat -compiler 14148

-gc 选项:

垃圾收集的堆统计信息

  • S0C:当前幸存者空间0容量(kB)
  • S1C:当前生存空间1的容量(kB)
  • S0U:幸存者空间0使用大小(kB)
  • S1U:幸存者空间1使用大小(kB)
  • EC:当前伊甸园空间容量(kB)
  • EU:伊甸园空间使用大小(kB)
  • OC:当前的老年代容量(kB)
  • OU:老年代使用大小(kB)
  • MC:元空间容量(kB)
  • MU:元空间使用大小(kB)
  • CCSC:压缩的类空间容量(kB)
  • CCSU:使用的压缩类空间(kB)
  • YGC:新生代垃圾收集事件的数量
  • YGCT:新生代垃圾回收时间
  • FGC:完整GC事件的数量
  • FGCT:完整的垃圾收集时间
  • GCT:总垃圾收集时间

代码如下:

package com.example.demo;

import java.io.IOException;

/*
    -gc 选项:垃圾收集的堆统计信息
        S0C:当前幸存者空间0容量(kB)
        S1C:当前生存空间1的容量(kB)
        S0U:幸存者空间0使用大小(kB)
        S1U:幸存者空间1使用大小(kB)
        EC:当前伊甸园空间容量(kB)
        EU:伊甸园空间使用大小(kB)
        OC:当前的老年代容量(kB)
        OU:老年代使用大小(kB)
        MC:元空间容量(kB)
        MU:元空间使用大小(kB)
        CCSC:压缩的类空间容量(kB)
        CCSU:使用的压缩类空间(kB)
        YGC:新生代垃圾收集事件的数量
        YGCT:新生代垃圾回收时间
        FGC:完整GC事件的数量
        FGCT:完整的垃圾收集时间
        GCT:总垃圾收集时间
 */
public class jstatdemo01 {
    //-Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc
    public static void main(String[] args) throws InterruptedException, IOException {
        final int _1MB = 1024 * 1024;
        byte[] b1 = new byte[2 * _1MB];
        System.out.println("1...");
        System.in.read();

        byte[] b2 = new byte[2 * _1MB];
        System.out.println("2...");
        System.in.read();

        byte[] b3 = new byte[2 * _1MB];
        System.out.println("3...");
        System.in.read();
    }
}

设置JVM参数

-Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc

运行结果如下:

代码中有System.in.read();需要点击回车键才能向下运行。

运行第一段时,结果如下:

        byte[] b1 = new byte[2 * _1MB];
        System.out.println("1...");
        System.in.read();

查看GC如下

点击回车,运行第二段代码:

        byte[] b2 = new byte[2 * _1MB];
        System.out.println("2...");
        System.in.read();

结果如下:

点击回车,运行第三段代码:

        byte[] b3 = new byte[2 * _1MB];
        System.out.println("3...");
        System.in.read();

查看GC,如下:

综合3次的GC来看,会发现。

第二次只增加的伊甸园区EU的数量,其他的没有变化。

第三次结果会发现幸存区、伊甸园区、新生代垃圾收集事件的数量、新生代垃圾回收时间、总垃圾收集时间被使用。

-gcutil 选项:

垃圾收集统计信息

  • S0:幸存者空间0利用率占该空间当前容量的百分比
  • S1:幸存者空间1利用率占空间当前容量的百分比
  • E:Eden空间利用率占空间当前容量的百分比
  • O:老年代利用率占空间当前容量的百分比
  • M:元空间利用率占空间当前容量的百分比
  • CCS:压缩的类空间利用率,以百分比表示
  • YGC:新生代GC事件的数量
  • YGCT:新生代垃圾回收时间
  • FGC:完整GC事件的数量
  • FGCT:完整的垃圾收集时间
  • GCT:总垃圾收集时间

代码如下:

package cn.itcast;

import java.io.IOException;

/*
    gcutil 选项:垃圾收集统计信息
        S0:幸存者空间0利用率占该空间当前容量的百分比
        S1:幸存者空间1利用率占空间当前容量的百分比
        E:Eden空间利用率占空间当前容量的百分比
        O:老年代利用率占空间当前容量的百分比
        M:元空间利用率占空间当前容量的百分比
        CCS:压缩的类空间利用率,以百分比表示
        YGC:新生代GC事件的数量
        YGCT:新生代垃圾回收时间
        FGC:完整GC事件的数量
        FGCT:完整的垃圾收集时间
        GCT:总垃圾收集时间
*/
public class Demo03 {
    //-Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc
    public static void main(String[] args) throws InterruptedException, IOException {
        final int _1MB = 1024 * 1024;
        byte[] b1 = new byte[2 * _1MB];
        System.out.println("1...");
        System.in.read();

        byte[] b2 = new byte[2 * _1MB];
        System.out.println("2...");
        System.in.read();

        byte[] b3 = new byte[2 * _1MB];
        System.out.println("3...");
        System.in.read();
    }
}

设置JVM参数

-Xms20M -Xmx20M -Xmn10M -XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc

运行后需要也需要点击三次回车

使用jstat命令,如下:

第三次老年代利用率占空间当前容量的百分比、元空间利用率占空间当前容量的百分比、压缩的类空间利用率,以百分比表示等都发生了变化。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不死鸟.亚历山大.狼崽子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值