写点什么

JVM 诊断之 jstat 工具使用

用户头像
hepingfly
关注
发布于: 2021 年 03 月 31 日
JVM 诊断之 jstat 工具使用

一、JVM 诊断工具

jstat:查看 JVM 统计信息


1)、介绍


jstat :JVM Statistics Monitoring Tool


用于监视虚拟机各种运行状态信息的命令行工具。


在没有 GUI 图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。常用于检测垃圾回收问题以及内存泄漏问题。


2)、基本语法


① 常用参数:

  • interval 参数 :用于指定输出统计数据的周期,单位为毫秒。即,查询间隔

jstat -class 3245 1000            每隔 1s 钟打印一次Loaded  Bytes  Unloaded  Bytes     Time   745  1741.7        0     0.0       0.15   745  1741.7        0     0.0       0.15   745  1741.7        0     0.0       0.15   745  1741.7        0     0.0       0.15   745  1741.7        0     0.0       0.15   745  1741.7        0     0.0       0.15
复制代码

3245 为进程 id, 1000 表示毫秒


  • count 参数:用于指定查询的总次数

jstat -class 3281 1000 3             每隔 1s 钟打印一次,总共打印 3 次Loaded  Bytes  Unloaded  Bytes     Time   745  1741.7        0     0.0       0.15   745  1741.7        0     0.0       0.15   745  1741.7        0     0.0       0.15
复制代码

3281 为进程 id, 1000 表示毫秒,3 表示打印 3 次


  • -t 参数 :可以在输出信息前加上一个 Timestamp 列,显示程序的运行时间。单位:秒

jstat -class -t 3316 1000Timestamp       Loaded  Bytes  Unloaded  Bytes     Time        116.9    745  1741.7        0     0.0       0.16        117.9    745  1741.7        0     0.0       0.16        118.9    745  1741.7        0     0.0       0.16        119.9    745  1741.7        0     0.0       0.16        120.9    745  1741.7        0     0.0       0.16        121.9    745  1741.7        0     0.0       0.16        122.9    745  1741.7        0     0.0       0.16 
复制代码

第一列表示程序从开始运行到现在的一个运行时间


  • -h 参数 :可以在周期性数据输出时,输出多少行数据后输出一个表头信息

jstat -class -h3 -t 3316 1000Timestamp       Loaded  Bytes  Unloaded  Bytes     Time       319.1    745  1741.7        0     0.0       0.16       320.2    745  1741.7        0     0.0       0.16       321.2    745  1741.7        0     0.0       0.16Timestamp       Loaded  Bytes  Unloaded  Bytes     Time       322.2    745  1741.7        0     0.0       0.16       323.2    745  1741.7        0     0.0       0.16       324.2    745  1741.7        0     0.0       0.16Timestamp       Loaded  Bytes  Unloaded  Bytes     Time       325.2    745  1741.7        0     0.0       0.16       326.2    745  1741.7        0     0.0       0.16       327.2    745  1741.7        0     0.0       0.16
复制代码

-h3 表示每三行输出一个表头信息


JVM 诊断的一个小经验:


  • 我们可以比较 Java 进程的启动时间(使用 -t 参数,结果的第一列就表示程序启动时间)以及总 GC 时间(GCT 列),或者两次测量的间隔时间以及总 GC 时间的增量,来得出 GC 时间占运行时间的比例。

  • 如果该比例超过 20%,则说明目前堆的压力比较大;如果该比例超过 90%,则说明堆里几乎没有可用的空间,随时都可能抛出 OOM 异常。



② option 参数


  • 类装载相关的:

  • -class :显示 ClassLoader 的相关信息:类的装载、卸载数量、总空间、类装载所消耗的时间

jstat -class 3163Loaded  Bytes  Unloaded  Bytes     Time 745  1741.7      0     0.0       0.19 	①    ②        ③      ④         ⑤ 	 ① 表示程序在运行过程中需要加载的类的个数 ② 表示程序在运行过程中加载的类占用的字节数 ③ 表示程序在运行过程中卸载的类的个数 ④ 表示程序在运行过程中卸载的类占用的字节数 ⑤程序运行花费的总体时间
复制代码


  • 垃圾回收相关的

  • -gc :显示与 GC 相关的堆信息。包括 Eden 区,两个 Survivor 区、老年代、永久代的容量、已用空间、GC 时间合计等信息

  • -gccapacity:显示内容与 -gc 基本相同。但是输出主要关注 Java 堆各个区域使用到的最大最小空间。

  • -gcutil :显示内容与 -gc 基本相同。但是输出主要关注已使用空间占总空间的百分比

  • -gccause :与 -gcutil 功能一样,但是会额外输出导致最后一次或当前正在发生的 GC 产生的原因

  • -gcnew :显示新生代 GC 状况

  • -gcnewcapacity :显示内容与 -gcnew 基本相同,输出主要关注使用到的最大、最小空间

  • -gcold :显示老年代 GC 状况

  • -gcoldcapacity:显示内容与 -gcold 基本相同,输出主要关注使用到的最大、最小空间


jstat -gc 结果详解

新生代:


  • S0C 是第一个幸存者区的大小(字节

  • S1C 是第二个幸存者区的大小(字节)

  • SOU 是第一个幸存者区已使用的大小(字节)

  • S1U 是第二个幸存者区已使用的大小(字节)

  • EC 是 Eden 空间的大小(字节)

  • EU 是 Eden 空间已使用大小(字节)


老年代:


  • OC 是老年代的大小(字节)

  • OU 是老年代已使用的大小(字节)


方法区(元空间):


  • MC 是方法区的大小

  • MU 是方法区已使用的大小

  • CCSC 是压缩类空间的大小

  • CCSU 是压缩类空间已使用的大小


其他:


  • YGC 是指从应用程序启动到采样时 young gc 次数

  • YGCT 是指从应用程序启动到采样时 young gc 消耗的时间(秒)

  • FGC 是指从应用程序启动到采样时 full gc 次数

  • FGCT 是指从应用程序启动到采样时 full gc 消耗的时间(秒)

  • GCT 是指从应用程序启动到采样时 gc 的总时间(Full GC 和 Young GC 时间的和)


通过 jstat 如何去判断是否出现内存泄漏?


1、在长时间运行的 Java 程序中,我们可以运行 jstat 命令连续获取多行性能数据,并取这几行数据中 OU 列(即已占用的老年代内存)的最小值


2、然后我们每隔一段较长时间重复上一次操作,来获得多组 OU 最小值。如果这些值呈上涨趋势,则说明该 Java 程序的老年代内存已使用量在不断上涨,这意味着无法回收的对象在不断增加,因此很有可能存在内存泄漏。



除了写文章还会更新视频,每天在视频号给你分享一个提升效率的小工具,感兴趣的可以关注一下哦

👇 👇 👇 👇



发布于: 2021 年 03 月 31 日阅读数: 20
用户头像

hepingfly

关注

视频号:hepingfly 分享干货,欢迎关注~ 2018.06.23 加入

B站程序员。目标是做一个有才华,身上有光的男人。

评论

发布
暂无评论
JVM 诊断之 jstat 工具使用