jstat是用于监视虚拟机各种运行状态信息的命令行工具。他可以显示本地或者远程虚拟机进程中的类加载,内存,垃圾收集,即时编译等运行时数据。
实例代码:

public class ScannerTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String info = scanner.next();
    }
}

启动后,使用上篇等jps 命令查看当前进程,然后在使用jstat工具进行查看当前进程虚拟机统计的信息。

-class 监视类加载,卸载数量,总空间以及类装载所耗费的时间

jstat -class 737

虚拟机监控程序功能对用户不可用 虚拟机监视程序_jvm

-compiler 输出即时编译器编译过的方法,耗时等信息

jstat -compiler 737

虚拟机监控程序功能对用户不可用 虚拟机监视程序_jvm_02

-printcompilation 输出已经被即时编译的方法

jstat -printcompilation 737

虚拟机监控程序功能对用户不可用 虚拟机监视程序_虚拟机监控程序功能对用户不可用_03


上面的指令与gc 无关,下面我们看看gc有关的,比如新生代,老年代,永久代等堆内存等消耗情况,实例代码:

* -Xms60m -Xmx60m -XX:SurvivorRatio=8
 */
public class GCTest {
    public static void main(String[] args) {
        ArrayList<byte[]> list = new ArrayList<>();

        for (int i = 0; i < 1000; i++) {
            byte[] arr = new byte[1024 * 100];//100KB
            list.add(arr);
            try {
                Thread.sleep(120);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

设置一下jvm参数,堆等最小值,和最大值,运行代码,还是上面的使用jps命令查看进程id然后在使用 jstat进行监控信息

-gc 监视堆状况,包括 Eden区,2个Survivor区,老年代,永久代等容量,已用空间,垃圾收集时间合计等信息

jstat -gc 840

虚拟机监控程序功能对用户不可用 虚拟机监视程序_java_04


jstat支持查询间隔,和次数我们来试试


jstat -gc 840 250 20

-gccapacity 监视内容和-gc一样,但主要输出主要关注堆各个区域使用到的最大,最小空间

jstat -gccapacity 863
jstat -gccapacity 863 250 10

虚拟机监控程序功能对用户不可用 虚拟机监视程序_java_05

-gcutil 与-gc基本相同,但关注与已使用空间占空间的百分比。

jstat -gcutil 880

虚拟机监控程序功能对用户不可用 虚拟机监视程序_java_06

-gccause 与-gcutil一样,但是会额外输出导致上一次垃圾收集产生的原因。

jstat -gccause 888

虚拟机监控程序功能对用户不可用 虚拟机监视程序_java_07

-gcnew 监视新生代垃圾收集状况

jstat -gcnew 888 250 10

-gcnewcapacity 与-gcnew基本相同,关注使用到到最大,最小空间

jstat -gcnewcapacity 888 250 20

-gcold 监视老年代垃圾收集状况

jstat -gcold 888

-gcoldcapacity 与-gcold基本相同,关注使用到到最大,最小空间

jstat -gcoldcapacity 888

-gcpermcapacity 输出永久代使用到到最大,最小空间。

jstat -gcpermcapacity 888

使用jstat工具在纯文本状态下监视虚拟机状态的变化,在用户体验下不如 JMC,VisualVM等可视化监控工具,但在生产情况下,不一定会使用到可视化工具,所以直接在控制台中使用jstat命令依然是一种常用到监控方式,好了jstat就聊到这里了,有问题下方讨论,一起学习。