jvm jstat
过去,我已经写过关于Oracle和/或OpenJDK Java开发工具包(JDK)附带的几个命令行工具的信息,但是我从来没有专门写过jstat工具 。 Oracle JDK 9文档Early Access指出jstat用于“监视Java虚拟机(JVM)统计信息”。 还有一个警告,“此命令是实验性的,不受支持。” 尽管我引用了JDK 9文档,但jstat是以Java SE 8 , Java SE 7 , Java SE 6和J2SE 5中的某种形式( 一次称为jvmstat )成为Sun / Oracle JDK的一部分。 Java 1.4.1引入了HotSpot JVM的工具(仅在设置了-XX:+UsePerfData
时启用),并且自Java 1.4.2开始提供了“始终在线”工具。
jstat
提供的许多信息可以从可视工具(例如VisualVM ,JMX和平台MBean),垃圾收集日志或通过JVM选项中收集。 但是,与每个替代方案相比, jstat
具有优势。 它的优点包括命令行工具所共有的优点,例如可以从脚本执行并运行而无需开发人员或其他人员。 能够将jstat
应用于已经运行的Java进程以开始监视其JVM统计信息,而不是在启动JVM时指定对那些选项的监视,这也很有用。
对于本文中的示例,我正在使用Oracle JDK 9 build 164 。 下一个屏幕快照显示了该版本,还显示了开始使用jstat
时要应用的第一个标志之一: -options
标志。
如屏幕快照所示,以及jstat文档中所述 , jstat -options
用于“显示特定平台安装的选项列表”。 在此处显示的示例中,以下选项可用:
-
-class
-
-compiler
-
-gc
-
-gccapacity
-
-gccause
-
-gcmetacapacity
-
-gcnew
-
-gcnewcapacity
-
-gcold
-
-gcoldcapacity
-
-gcutil
-
-printcompilation
在本文中,我将只讨论这些可用选项的一小部分,但是jstat文档提供了一个句子来描述每个jstat
选项,并且每个选项的命令行用法与所有其他选项非常相似。 实际上,一旦学习了有关jstat
使用的一些小知识,各种选项的执行就变得容易了。 使用jstat
的困难部分通常是解释jstat
提供的数据。
jstat -help
选项将打印简单用法,如下一个屏幕快照所示。
从jstat
用法消息中,我们了解到jstat
命令行工具是通过首先运行命令名称( jstat
)和下一个带连字符的选项名称,然后是可选的-t
和/或-h
标志,然后运行该命令来执行的vimid ,并包含一个可选的时间间隔和在提供的时间间隔上执行命令的可选次数。 示例比描述性文字清晰,这篇文章和jstat文档中给出了一些示例。
为了监视“本地” JVM统计信息, vmid只是JVM进程的进程ID。 这与髋关节jcmd (或stodgy jps )为Java进程返回的PID相同。 下一个屏幕快照演示了使用jcmd的Java应用程序,我在我的例子(监测(在这种情况下,8728)来识别PID JEDIT在这种情况下)。
jstat
文档的“虚拟机标识符”部分提供了有关vmid的更多详细信息,因为更复杂的vmid (用于JVM统计信息的远程监视)可以包括协议,本地目标计算机的vmid ,主机和端口。 尽管本文中的所有示例都将使用jstat
和简单的Java PID( vmid ),但jstat文档的确提供了使用更详细的vmid进行JVM统计信息远程监视的示例。
对于本文中的其余示例,我想要一个Java应用程序,从JVM统计信息监视的角度来看,它比JEdit更有趣。 我决定在强烈推荐的Plumbr博客上使用Nikita Salnikov-Tarnovski的帖子“ Garbage Collection:提高吞吐量 ”中的“ PigInThePython ”示例应用程序。 如果您有兴趣查看PigInThePython
的源代码,请参阅该文章 。
对于使用jstat
第一个示例,我使用其最常用的选项之一: -gcutil
。 除了演示-gcutil
选项之外,我还将使用第一个示例来演示和解释除gcutil
之外通常适用于其他jstat
选项的jstat
输出选项。
以下屏幕快照演示了如何使用jcmd
来获取PigInThePython
应用程序的PID(在本例中为5096)以及如何以最简单的形式运行jstat -gcutil
。
jstat -gcutil
以最简单的形式(没有其他选项)显示没有时间戳的单行输出。 列标题中描述jstat文档节“-gcutil选项”,其也描述了-gcutil
选项如,“垃圾收集统计摘要”。 例如,本文档说明,其中一些列指示不同空间分配的使用百分比,而其他列指示垃圾收集事件的数量和垃圾收集的总时间。
我们通常希望将jstat
提供的统计信息与受监视系统中其他事件发生的时间相关联,以识别这些事件与对JVM的影响之间的相关性。 jstat -t
选项将在输出的开头加上时间戳。 此时间戳是自受监视的JVM启动以来的秒数。 尽管这对人类来说不像其他格式那样方便阅读,但确实可以将JVM统计信息与JVM运行所在的时间范围以及包含时间戳的垃圾收集日志相关联。 下一个屏幕快照演示了-t
的作用:
监视JVM统计信息(例如由jstat -gcutil
提交的统计信息)不止一次通常非常有用。 下一个屏幕快照演示了如何使用指定的间隔( 100ms
指定的100毫秒间隔,以每100毫秒捕获并显示这些结果。
第一次显示快照后,最后一个屏幕快照中的输出永远不会重复带有列首字母缩写的标题。 如果希望在一定数量的行之后重复该标头,以便更轻松地知道哪些数字属于输出中更远的哪一列,则-h
选项可用于指定列之后的结果数标头再次显示。 在下一个屏幕快照中, -h20
用于每20行查看一次标题。
有时可能希望让jstat
如此频繁地且仅在一定次数内提供其数据。 间隔允许您指定结果之间的持续时间,间隔之后的任何整数都将限制显示结果的总次数。 在接下来的屏幕快照,所述15
处命令的末尾限制输出至15点总的行。
jstat -gccause
选项返回与-gcutil
相同的信息,但还会添加有关导致受监视垃圾收集的原因的信息。 以下屏幕快照对此进行了演示。
在上面的屏幕快照中,我们看到“上次垃圾收集的原因”(LGCC)是“ G1大量分配”,而“当前垃圾收集的原因”(GCC)是“无GC”(当前没有垃圾收集)进行)。
下一个屏幕快照演示了如何使用jstat -class
查看“类加载器统计信息”,以了解已加载的类数(“ Loaded”),已加载的千字节数(第一个“ Bytes”),已卸载的类数(“ Unloaded”)以及数量卸载的字节数(第二个“字节”),以及“执行类加载和卸载操作所花费的时间”(“时间”)。
命令jstat -printcompilation
指示“ Java HotSpot VM编译器方法统计信息”,并在下一个屏幕快照中演示。
-printcompilation
选项显示列“已编译”(“最近编译的方法执行的编译任务数”),“大小”(“最近编译的方法的字节码的字节数”),“类型”(“最近编译的方法的编译类型”和“方法”(最近编译的方法的类/方法的名称,以与HotSpot VM选项-XX:+PrintCompilation
一致的格式表示)。
使用jstat -compiler
命令,我们可以查看“ Java HotSpot VM即时编译器统计信息”,例如执行的编译任务数(“ Compiled”),失败的编译任务数(“ Failed”),无效的编译任务数(“无效”),编译所花费的时间(“时间”),上次失败的编译的类型和类/方法名称(“ FailedType”和“ FailedMethod”)。 下一个屏幕快照对此进行了演示。
jstat
还有更多可用的选项,其中大多数选项特定于受监视JVM中有关垃圾回收的不同观点。
jstat
文档警告该工具是试验性的,在JDK的未来版本中可能会更改或删除。 该文档还警告不要编写脚本和工具来解析jstat
的输出,因为将来输出的内容或格式可能会更改。 但是,我可以看到有人可能会冒这个险并编写解析代码,因为可以从脚本轻松访问此命令行工具,并且所需的解析代码不会很复杂。
这篇文章是jstat
,但是要了解更多有关该工具的知识。 与使用该工具相比,对该工具结果的解释要复杂得多,并且jstat
提供的数据分析可能比收集数字的工作更具挑战性。 下面列出了一些其他资源,以提供有关使用jstat
工具收集和分析Java虚拟机统计信息的更多信息。
其他jstat资源
- Java Platform 9,标准版工具参考指南 : jstat
- Java Platform 8,Standard Edition故障排除指南 : jstat实用程序
- Plumbr:jstat
- 使用jstat监视Java垃圾收集
- 解释jstat的Full GC事件数
- 解释jstat(堆内存)以怀疑Java内存泄漏
- 解释jstat结果
- jstat工具:-gc选项提供的新元空间统计信息
- 学习java jstat
- 'jstat -gcutil'–垃圾回收统计
- 'jstat'命令选项和参数
- 使用Jstat在Java中进行GC监视
- 在Java中监视垃圾收集
- 使用jstat报告自定义JVM指标集
翻译自: https://www.javacodegeeks.com/2017/05/jvm-statistics-jstat.html
jvm jstat