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

2024-02-24 16:38

本文主要是介绍JDK14性能管理工具:jstat使用介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 简介
  • JStat命令
  • JStat Output Options
    • class
    • compiler
    • gc
    • gccapacity
    • gcnew
    • gcnewcapacity
    • gcold
    • gcoldcapacity
    • gcmetacapacity
    • gcutil
    • gccause
    • printcompilation
  • 总结

简介

作为一个程序员,经常会为如何定位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     Time19822.8   5214 10752.5        0     0.0       2.9119823.0   5214 10752.5        0     0.0       2.9119823.0   5214 10752.5        0     0.0       2.9119823.2   5214 10752.5        0     0.0       2.9119823.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 FailedMethod2675      0       0     5.35          02675      0       0     5.35          02675      0       0     5.35          02675      0       0     5.35          02675      0       0     5.35          0
  • Compiled - 执行的编译任务的次数
  • Failed - 编译任务失败次数
  • Invalid - 置位无效的编译任务次数
  • Time - 执行编译任务花费的时间
  • FailedType - 上一次失败编译的编译类型
  • FailedMethod - 上一次编译失败的方法名

gc

gc统计的是gc heap信息

jstat -gc 53528 100 5S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT0.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.0280.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.0280.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.0280.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.0280.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 5NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC   CGC0.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     20.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     20.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     20.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     20.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 5S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT0.0 4096.0    0.0 3978.2 15  15 5120.0  56320.0  33792.0      4    0.0250.0 4096.0    0.0 3978.2 15  15 5120.0  56320.0  33792.0      4    0.0250.0 4096.0    0.0 3978.2 15  15 5120.0  56320.0  33792.0      4    0.0250.0 4096.0    0.0 3978.2 15  15 5120.0  56320.0  33792.0      4    0.0250.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 5NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC   CGC0.0   716800.0    60416.0      0.0      0.0 716800.0   4096.0   716800.0    56320.0     4     0     20.0   716800.0    60416.0      0.0      0.0 716800.0   4096.0   716800.0    56320.0     4     0     20.0   716800.0    60416.0      0.0      0.0 716800.0   4096.0   716800.0    56320.0     4     0     20.0   716800.0    60416.0      0.0      0.0 716800.0   4096.0   716800.0    56320.0     4     0     20.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 5MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT    CGC    CGCT     GCT21552.0  20680.9   2688.0   2468.0     15360.0     15215.0      4     0    0.000     2    0.003    0.02821552.0  20680.9   2688.0   2468.0     15360.0     15215.0      4     0    0.000     2    0.003    0.02821552.0  20680.9   2688.0   2468.0     15360.0     15215.0      4     0    0.000     2    0.003    0.02821552.0  20680.9   2688.0   2468.0     15360.0     15215.0      4     0    0.000     2    0.003    0.02821552.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 5OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT    CGC    CGCT     GCT0.0    716800.0     15360.0     15360.0     4     0    0.000     2    0.003    0.0280.0    716800.0     15360.0     15360.0     4     0    0.000     2    0.003    0.0280.0    716800.0     15360.0     15360.0     4     0    0.000     2    0.003    0.0280.0    716800.0     15360.0     15360.0     4     0    0.000     2    0.003    0.0280.0    716800.0     15360.0     15360.0     4     0    0.000     2    0.003    0.028

gcmetacapacity

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

jstat -gcmetacapacity 53528 100 5MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT    CGC    CGCT     GCT0.0  1069056.0    21552.0        0.0  1048576.0     2688.0     4     0    0.000     2    0.003    0.0280.0  1069056.0    21552.0        0.0  1048576.0     2688.0     4     0    0.000     2    0.003    0.0280.0  1069056.0    21552.0        0.0  1048576.0     2688.0     4     0    0.000     2    0.003    0.0280.0  1069056.0    21552.0        0.0  1048576.0     2688.0     4     0    0.000     2    0.003    0.0280.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 5S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT0.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.0280.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.0280.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.0280.00  97.12  60.00  99.06  95.96  91.82      4    0.025     0    0.000     2    0.003    0.0280.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 5S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT    LGCC                 GCC0.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 GC0.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 GC0.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 GC0.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 GC0.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 Method2675     23    1 jdk/internal/misc/InnocuousThread eraseThreadLocals2675     23    1 jdk/internal/misc/InnocuousThread eraseThreadLocals2675     23    1 jdk/internal/misc/InnocuousThread eraseThreadLocals2675     23    1 jdk/internal/misc/InnocuousThread eraseThreadLocals2675     23    1 jdk/internal/misc/InnocuousThread eraseThreadLocals
  • Compiled - 最近执行的编译任务次数
  • Size - 最近编译方法的大小
  • Type - 最新编译方法的类型
  • Method - 最新编译方法的名字

总结

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

本文作者:flydean程序那些事

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

本文来源:flydean的博客

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

这篇关于JDK14性能管理工具:jstat使用介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/742712

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1