使用jstat的JVM统计信息

过去,我已经写过关于Oracle和/或OpenJDK Java开发工具包(JDK)随附的几个命令行工具的信息,但是我从来没有专门写过jstat工具Oracle JDK 9文档Early Access指出jstat用于“监视Java虚拟机(JVM)统计信息”。 还有一个警告,“此命令是实验性的,不受支持。” 尽管我引用了JDK 9文档,但是jstatJava SE 8Java SE 7Java SE 6J2SE 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资源

翻译自: https://www.javacodegeeks.com/2017/05/jvm-statistics-jstat.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值