当前位置: 首页 > news >正文

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:gcpublic 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:gcpublic 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命令,如下:

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

相关文章:

  • 五步定位性能瓶颈
  • 第13章 Python建模库介绍
  • 提权方式及原理汇总
  • [力扣题解] 474. 一和零
  • vue 拷贝
  • RNN-循环神经网络
  • Linux——进程信号(一)
  • Spring Security整合Gitee第三方登录
  • 智能车竞赛指南:从零到一,驶向自动驾驶的未来
  • v-md-editor和SSE实现ChatGPT的打字机式输出
  • 一篇讲透排序算法之插入排序and选择排序
  • Langchain:生态能力学习和智能代理体系对比
  • 用于图像和用于自然语言的神经网络区别
  • 区块链的运行原理与演示
  • Vue 离线地图实现
  • 【译】JS基础算法脚本:字符串结尾
  • “大数据应用场景”之隔壁老王(连载四)
  • Hibernate【inverse和cascade属性】知识要点
  • Java多态
  • leetcode46 Permutation 排列组合
  • mongo索引构建
  • React的组件模式
  • Selenium实战教程系列(二)---元素定位
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • Vue实战(四)登录/注册页的实现
  • 程序员该如何有效的找工作?
  • 基于 Babel 的 npm 包最小化设置
  • 配置 PM2 实现代码自动发布
  • 收藏好这篇,别再只说“数据劫持”了
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 系统认识JavaScript正则表达式
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • mysql面试题分组并合并列
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #《AI中文版》V3 第 1 章 概述
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $$$$GB2312-80区位编码表$$$$
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (007)XHTML文档之标题——h1~h6
  • (JS基础)String 类型
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (九)One-Wire总线-DS18B20
  • (理论篇)httpmoudle和httphandler一览
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • ******之网络***——物理***
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .gitignore文件设置了忽略但不生效
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET NPOI导出Excel详解