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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/633565.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谷歌插件编写

目录 manifest.json {"manifest_version": 3,"name": "Floating Ball","version": "1.0","description": "A floating ball on the right side of the webpage.","permissions": ["act…

C语言 数组——计算最大值的函数实现

目录 计算最大值 计算最大值的函数实现 应用实例:计算班级最高分​编辑​编辑 返回最大值所在的下标位置 返回最大值下标位置的函数实现​编辑 一个综合应用实例——青歌赛选手评分​编辑​编辑​编辑​编辑​编辑 计算最大值 计算最大值的函数实现 应用实例&…

hcia datacom学习(8):静态NAT、动态NAT、NAPT、Easy IP、NAT server

1.私网地址 在现实环境中,企业、家庭使用的网络是私网地址(内网),运营商维护的网络则是公网地址(外网)。私网地址是在局域网(LAN)内使用的,因此无法被路由,不…

多线程讲解(详解)

目录 什么是多线程? 为什么要使用多线程? 线程的创建 使用Thread实现 从以上代码我们梳理一下多线程创建步骤: 注意: 小示例 首先,引入依赖 然后,按照我们刚刚说的构建多线程的步骤进行构建&#…

【C++】牛客 ——NC138 矩阵最长递增路径

✨题目链接: NC138 矩阵最长递增路径 ✨题目描述 给定一个 n 行 m 列矩阵 matrix ,矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径,使这条路径上的元素是递增的。并输出这条最长路径的长度。 这个路径必须满足以下条件&#…

医学科技查新中对查新点的撰写方法!附案例讲解!

我国的科技查新工作最早是从医学领域开始的,始于1985年中国科学院医学情报所,后来逐步发展到工、农等其 他各个领域。医学科技查新包括立项查新和成果查新两个部分,其中医学立项查新,它是指在医学科研项目申报开题之前&#xff0c…

Wondershaper网络限制脚本源码分析一(下载速度限制篇)

Wondershaper 是一个简单的 Linux 命令行工具,用于自动管理和控制网络接口的上行和下行带宽,旨在为用户提供稳定的网络体验,尤其是在网络拥塞的情况下。它通过 Traffic Control (tc) 工具集实现这一功能,但与直接使用 tc 相比&…

python基础之开发工具配置

day01-Python基础 一、Python介绍 Python是一个计算编程语言,可以实现计算程序开发,也可以用于数据处理。SQL语言只能用于结构化数据的处理。Python的比SQL应用更广泛。 1990年推广Python,最初是应用于运维开发,随着不断更新迭代…

xxe漏洞--xml外部实体注入漏洞

1.xxe漏洞介绍 XXE(XML External Entity Injection)是一种攻击技术,它允许攻击者注入恶意的外部实体到XML文档中。如果应用程序处理XML输入时未正确配置,攻击者可以利用这个漏洞访问受影响系统上的敏感文件、执行远程代码、探测内…

PLC工程师按这个等级划分是否靠谱?

在工业自动化领域,PLC工程师扮演着至关重要的角色,他们负责构建、维护自动化系统,推动工业4.0进程的发展。成为一名优秀的PLC工程师需要经历不同境界的发展阶段,每个阶段都对应着不同的技能要求和责任。以下是PLC工程师的六种级别…

ffmpeg中AVCodec是否需要手动销毁?

在开发到退出一个视频播放功能时,看到对AVCodec*这个指针做了初始化,但是突然有一个好奇的疑问,这个AVCodec到底是否需要人工手动销毁? 我在初始化的时候这样用的: const AVCodec *v_codec NULL; AVCodecContext *v…

从零到一建设数据中台 - 应用场景及实施路径

从零到一建设数据中台 - 应用场景及实施路径 一、数据中台技术场景 异构数据源集成、交换场景:实现异构数据源的整合集中和交换共享数据治理场景:从元数据角度实现企业级数据目录管理、保证数据质量、数据安全,提供数据血缘、数据服务数仓、…

记录centos中操作(查找、结束、批量)进程以及crontab定时写法的知识

环境:vps,centos7,python3。 近期写了个python程序,用青龙面板在centos上运行。程序中有while无限循环,但是我在青龙中设置了定时任务(每隔半小时运行一次),于是造成了进程中有多个…

宁波财经学院第十三周李倩教学检查第一节课

好奇和满足好奇心的 0.简单的介绍额 1.李倩提到了如何导入jar包,这应该如何去导入呢? 2.波哥防区只获取了一个request的字段 获得文件内容和保存文件

[IMX6ULL驱动开发]-Linux对中断的处理(一)

目录 中断概念的引入 ARM架构中断的流程 异常向量表 Linux系统对中断的处理 ARM对程序和中断的处理 Linux进程中断处理 中断概念的引入 如何理解中断,我们可以进行如下抽象。把CPU看做一个母亲,当它正在执行任务的时候,可以看为是一个母…

运维出现的问题 --集成

运维出现的问题 集成 macos 本地打的镜像,推到线上出现 images platform (linux/arm64) does not match the detected解决办法 macos 本地打的镜像,推到线上出现 image’s platform (linux/arm64) does not match the detected WARNING: The requested …

Nacos 进阶篇---Nacos服务端怎么维护不健康的微服务实例 ?(七)

一、引言 在 Nacos 后台管理服务列表中,我们可以看到微服务列表,其中有一栏叫“健康实例数” (如下图),表示对应的客户端实例信息是否可用状态。 那Nacos服务端是怎么感知客户端的状态是否可用呢 ? 本章…

Go-zero(api部分)

目录 api的语法: type:用于定义请求/响应体 service:定义HTTP服务 server:控制生成HTTP服务时候的meta信息 根据api文档生成最小HTTP服务 目录结构 api响应封装 api的语法: 首先定义一个api文档 type&#xff…

nginx+nginx-http-flv-module在Linux服务器搭建

需求 在服务器搭建点播/视频平台的话需要在服务器搭建nginx和rtmp模块 rtmp模块 rtmp 模块有 nginx-rtmp-module ,但是我们这里使用 nginx-http-flv-module 来替代。因为后者是基于前者开发的,前者拥有的功能后者都有,后者是国内的开发开…