使用jstat的JVM统计信息

过去,我已经写过关于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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每天一点点之 taro 框架开发 - taro路由及传参

1.路由 taro的路由是自带的,不需要我们额外配置,只需要我们在app.js下config中配置pages即可 class App extends Component {config {pages: [pages/test/test,pages/index/index],} } 2.taro通过api实现跳转,替换 官网地址:taro…

调用支付jsapi缺少参数:total_fee_小程序支付问题怎么解决?

微信小程序开发的过程一定会遇到各种问题,最让人棘手的就是支付问题,因为没有支付做商城类似的小程序就没有办法完成最关键的一步。那么支付失败到底什么原因呢?一下子收集了几个错误类似,希望对你有帮助:No.1{err_cod…

Visual Stutio中win32控制台应用程序、win32项目、MFC项目的区别:

我的理解,我首先把这几个货分为两大类;第一类包括win32控制台应用程序,第二类就是剩下那俩货。而剩下那俩货又有一个包含关系,即win32项目包含mfc。(我个人是这个区分的。) 一、 区别: (1&…

二分图匹配【模板】

传送门&#xff1a; #include <cstdio> #include <cstring> #include <cmath> using namespace std; #define ll long long #define re register const int N1005; inline void read(int &a) {a0;int d1;char ch;while(chgetchar(),ch>9||ch<0)if(…

c++两个数组对比去掉重复的元素_30 数组案例

数组案例案例一&#xff1a;筛选指定数组元素要求&#xff1a;将数组[2,0,6,1,77,0,52,0,25,7]中的0去掉后&#xff0c;形成一个不包含0的新数组。var arr [2,0,6,1,77,0,52,0,25,7];var newArr [];for(var i0; i<arr.length; i){if(arr[i]!0){newArr[newArr.length]arr[i…

排序并记录排序前的索引(类似matlab sort函数)

这里用到vector比较方便。 #include<iostream> #include<vector> #include<algorithm> using namespace std; struct num_label { int num; int label; }; //自定义“大于” bool comp(const num_label &a, const num_label &b) { return a.n…

selenium实现登录百度(自动识别简单验证码)

需要做的工作 0、工程结构 1、代码&#xff1a; ①baidu_login.py 1 import re2 import os3 import sys4 import time5 import random6 from selenium import webdriver7 from PIL import Image, ImageEnhance8 import pytesseract9 from func import base642str, str2base6410…

为什么猫王不应该访问Java

最近&#xff0c;我参与了一个关于Java的Optional类型系统的漫长的Twitter讨论 &#xff0c;该系统区分可空类型和非可空类型以及Elvis运算符 &#xff0c;该运算符允许选择空值安全的成员。 后者被认为是简洁的null处理的杀手级功能&#xff0c;对此我强烈不同意。 我对此的看…

python a and b_python-尽管Numpy建议a.b,为什么a.dot(b)比a @ b更...

根据question的答案,也根据numpy的答案,与a.dot(b)相比,二维数组的矩阵乘法最好通过a b或numpy.matmul(a,b)完成.If both a and b are 2-D arrays, it is matrix multiplication, but usingmatmul or a b is preferred.我做了以下基准测试,发现相反的结果.问题&#xff1a;我的…

Mysql高可用集群-解决MMM单点故障

目录 一.理论概述组件介绍三.部署四.测试五.总结preface: MMM架构相比于MHA来说各方面都逊色不少,写这篇案例也算是整理下思路吧. 一.理论概述 MMM(Master-Master replication Manager for MySQL) 是一套支持双主日常管理的脚本程序,使用Perl语言开发,主要用来监控和管理MySQL双…

vector元素的读取

1通过下标&#xff1a; int a[6] { 1,2,3,4,5,6 }; vector<int> b(a, a 4); for (int i 0; i < b.size() - 1; i) cout << b[i] << " "; 2通过迭代器 int a[6] { 1,2,3,4,5,6 }; vector<int> b(a, a 4); for (vector<int>:…

vector 中的元素去重

#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { cout << "********************一维向量*************************" << endl; vector<int> a; for (int i 0; i < 6; i) …

tcp的3次握手4次挥手

转载于:https://www.cnblogs.com/georgexu/p/10909808.html

python 如何定义字典_python dict如何定义

1.字典的定义字典的格式&#xff1a;字典名 {key1:value1, key2:value2,...}字典是无序的&#xff0c;是可变的数据类型字典的key不能是可变的数据类型(列表 字典)字典的key是不能重复的&#xff0c;但value可以例&#xff1a;my_dict {"name": "小明", …

MS SQL JSON类型type

在MS SQL Server 2016&#xff0c;已经支持JSON处理。 执行下面代码&#xff0c;将获取ms sql server对象类型以及其说明: IF OBJECT_ID(tempdb.dbo.#json_type) IS NOT NULL DROP TABLE #json_typeCREATE TABLE #json_type ( [type] TINYINT,[data_type] NVARCHAR(30) ) IN…

Eigen(8)实例最小二乘法

用Eigen库解Axb线性方程&#xff0c;使用最小二乘法 #include <iostream>#include <Eigen/Dense>using namespace std;using namespace Eigen;int main(){//对方程AxbMatrixXf A MatrixXf::Random(3, 2);std::cout << "Here is the matrix A:\n"…

java 和javafx_JavaFX 2 XYCharts和Java 7功能

java 和javafx我最喜欢的JavaFX 2功能之一是它在javafx.scene.chart包中提供的标准图表。 该软件包提供了几种不同类型的现成图表。 除其中之一&#xff08; PieChart &#xff09;外&#xff0c;所有其他均为“ 2轴图”&#xff08; XYChart的特定实现&#xff09;。 在本文中…

python语句分为什么语句_在python中如何分句

在处理文本时&#xff0c;会遇到需要将文本以 句子 为单位进行切分(分句)的场景&#xff0c;而文本又可以分为 中文文本 和 英文文本 &#xff0c;处理的方法会略有不同。本文会介绍 Python 是如何处理 分句 的。分句的关键是找到合适的结束符号&#xff0c;比如&#xff1a;中…

Spring框架(二) ---- bean的歧义性

自动装配bean时&#xff0c;如果符合条件的bean超过一个&#xff0c;就会出现歧义性&#xff0c;抛出NoUniqueBeanDefinitionException异常&#xff0c;有如下两种方法保证bean的唯一性&#xff1a; 一、使用Primary注解标记首选bean 1.与Component注解组合使用在自动扫描的bea…

Eigen(7)Map类

这里将解释Eigen如何与原生raw C/C 数组混合编程。 1. 简介 Eigen中定义了一系列的vector和matrix&#xff0c;相比copy数据&#xff0c;更一般的方式是复用数据的内存&#xff0c;将它们转变为Eigen类型。Map类很好地实现了这个功能。 2. Map类型 Map的定义 Map<Matrix&…