jstat命令(Java Virtual Machine Statistics Monitoring Tool)
1、介绍
Jstat用于监控基于HotSpot的JVM,对其堆的使用情况进行实时的命令行的统计,使用jstat我们可以对指定的JVM做如下监控:
- 类的加载及卸载情况
- 查看新生代、老生代及持久代的容量及使用情况
- 查看新生代、老生代及持久代的垃圾收集情况,包括垃圾回收的次数及垃圾回收所占用的时间
- 查看新生代中Eden区及Survior区中容量及分配情况等
jstat工具特别强大,它有众多的可选项,通过提供多种不同的监控维度,使我们可以从不同的维度来了解到当前JVM堆的使用情况。详细查看堆内各个部分的使用量,使用的时候必须加上待统计的Java进程号,可选的不同维度参数以及可选的统计频率参数。
它主要是用来显示GC及PermGen相关的信息,如果对GC不怎么了解,先看这篇文章:http://blog.csdn.net/fenglibing/archive/2011/04/13/6321453.aspx,否则其中即使你会使用jstat这个命令,你也看不懂它的输出。
2、语法
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
generalOption - 单个的常用的命令行选项,如-help, -options, 或 -version。
outputOptions -一个或多个输出选项,由单个的statOption选项组成,可以和-t, -h, and -J等选项配合使用。
statOption:
根据jstat统计的维度不同,可以使用如下表中的选项进行不同维度的统计,不同的操作系统支持的选项可能会不一样,可以通过-options选项,查看不同操作系统所支持选项,如:
| Option | Displays... |
|---|---|
| class | 用于查看类加载情况的统计 |
| compiler | 用于查看HotSpot中即时编译器编译情况的统计 |
| gc | 用于查看JVM中堆的垃圾收集情况的统计 |
| gccapacity | 用于查看新生代、老生代及持久代的存储容量情况 |
| gccause | 用于查看垃圾收集的统计情况(这个和-gcutil选项一样),如果有发生垃圾收集,它还会显示最后一次及当前正在发生垃圾收集的原因。 |
| gcnew | 用于查看新生代垃圾收集的情况 |
| gcnewcapacity | 用于查看新生代的存储容量情况 |
| gcold | 用于查看老生代及持久代发生GC的情况 |
| gcoldcapacity | 用于查看老生代的容量 |
| gcpermcapacity | 用于查看持久代的容量 |
| gcutil | 用于查看新生代、老生代及持代垃圾收集的情况 |
| printcompilation | HotSpot编译方法的统计 |
-h n
用于指定每隔几行就输出列头,如果不指定,默认是只在第一行出现列头。
-JjavaOption
用于将给定的javaOption传给java应用程序加载器,例如,“-J-Xms48m”将把启动内存设置为48M。如果想查看可以传递哪些选项到应用程序加载器中,可以相看如下的文档:
Linux and Solaris:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/solaris/java.html
Windows: http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/java.html
-t n
用于在输出内容的第一列显示时间戳,这个时间戳代表的时JVM开始启动到现在的时间(注:在IBM JDK5中是没有这个选项的)。
vmid - VM的进程号,即当前运行的java进程号。
还有两个关于显示频率的选项:
interval–间隔时间,单位可以是秒或者毫秒,通过指定s或ms确定,默认单位为毫秒。
count-打印次数,如果缺省则打印无数次。
3、不同的统计维度(statOption)及输出说明
-class
| 列名 | 说明 |
|---|---|
| Loaded | 加载了的类的数量 |
| Bytes | 加载了的类的大小,单为Kb |
| Unloaded | 卸载了的类的数量 |
| Bytes | 卸载了的类的大小,单为Kb |
| Time | 花在类的加载及卸载的时间 |
-compiler
| 列名 | 说明 |
|---|---|
| Compiled | 编译任务执行的次数 |
| Failed | 编译任务执行失败的次数 |
| Invalid | 编译任务非法执行的次数 |
| Time | 执行编译花费的时间 |
| FailedType | 最后一次编译失败的编译类型 |
| FailedMethod | 最后一次编译失败的类名及方法名 |
-gc
| 列名 | 说明 |
|---|---|
| S0C | 新生代中Survivor space中S0当前容量的大小(KB) |
| S1C | 新生代中Survivor space中S1当前容量的大小(KB) |
| S0U | 新生代中Survivor space中S0容量使用的大小(KB) |
| S1U | 新生代中Survivor space中S1容量使用的大小(KB) |
| EC | Eden space当前容量的大小(KB) |
| EU | Eden space容量使用的大小(KB) |
| OC | Old space当前容量的大小(KB) |
| OU | Old space使用容量的大小(KB) |
| PC | Permanent space当前容量的大小(KB) |
| PU | Permanent space使用容量的大小(KB) |
| YGC | 从应用程序启动到采样时发生 Young GC 的次数 |
| YGCT | 从应用程序启动到采样时 Young GC 所用的时间(秒) |
| FGC | 从应用程序启动到采样时发生 Full GC 的次数 |
| FGCT | 从应用程序启动到采样时 Full GC 所用的时间(秒) |
| GCT | T从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC |
-gccapacity
| 列名 | 说明 |
|---|---|
| NGCMN | 新生代的最小容量大小(KB) |
| NGCMX | 新生代的最大容量大小(KB) |
| NGC | 当前新生代的容量大小(KB) |
| S0C | 当前新生代中survivor space 0的容量大小(KB) |
| S1C | 当前新生代中survivor space 1的容量大小(KB) |
| EC | Eden space当前容量的大小(KB) |
| OGCMN | 老生代的最小容量大小(KB) |
| OGCMX | 老生代的最大容量大小(KB) |
| OGC | 当前老生代的容量大小(KB) |
| OC | 当前老生代的空间容量大小(KB) |
| PGCMN | 持久代的最小容量大小(KB) |
| PGCMX | 持久代的最大容量大小(KB) |
| PGC | 当前持久代的容量大小(KB) |
| PC | 当前持久代的空间容量大小(KB) |
| YGC | 从应用程序启动到采样时发生 Young GC 的次数 |
| FGC | 从应用程序启动到采样时发生 Full GC 的次数 |
-gccause
这个选项用于查看垃圾收集的统计情况(这个和-gcutil选项一样),如果有发生垃圾收集,它还会显示最后一次及当前正在发生垃圾收集的原因,它比-gcutil会多出最后一次垃圾收集原因以及当前正在发生的垃圾收集的原因。
| 列名 | 说明 |
|---|---|
| LGCC | 最后一次垃圾收集的原因,可能为“unknown GCCause”、“System.gc()”等 |
| GCC | 当前垃圾收集的原因 |
-gcnew
| 列名 | 说明 |
|---|---|
| S0C | 当前新生代中survivor space 0的容量大小(KB) |
| S1C | 当前新生代中survivor space 1的容量大小(KB) |
| S0U | S0已经使用的大小(KB) |
| S1U | S1已经使用的大小(KB) |
| TT | Tenuring threshold,要了解这个参数,我们需要了解一点Java内存对象的结构,在Sun JVM中,(除了数组之外的)对象都有两个机器字(words)的头部。第一个字中包含这个对象的标示哈希码以及其他一些类似锁状态和等标识信息,第二个字中包含一个指向对象的类的引用,其中第二个字节就会被垃圾收集算法使用到。 在新生代中做垃圾收集的时候,每次复制一个对象后,将增加这个对象的收集计数,当一个对象在新生代中被复制了一定次数后,该算法即判定该对象是长周期的对 象,把他移动到老生代,这个阈值叫着tenuring threshold。这个阈值用于表示某个/些在执行批定次数youngGC后还活着的对象,即使此时新生的的Survior没有满,也同样被认为是长周 期对象,将会被移到老生代中。 |
| MTT | Maximum tenuring threshold,用于表示TT的最大值。 |
| DSS | Desired survivor size (KB).可以参与这里:http://blog.csdn.net/yangjun2/article/details/6542357 |
| EC | Eden space当前容量的大小(KB) |
| EU | Eden space已经使用的大小(KB) |
| YGC | 从应用程序启动到采样时发生 Young GC 的次数 |
| YGCT | 从应用程序启动到采样时 Young GC 所用的时间(单位秒) |
-gcnewcapacity
| 列名 | 说明 |
|---|---|
| NGCMN | 新生代的最小容量大小(KB) |
| NGCMX | 新生代的最大容量大小(KB) |
| NGC | 当前新生代的容量大小(KB) |
| S0CMX | 新生代中SO的最大容量大小(KB) |
| S0C | 当前新生代中SO的容量大小(KB) |
| S1CMX | 新生代中S1的最大容量大小(KB) |
| S1C | 当前新生代中S1的容量大小(KB) |
| ECMX | 新生代中Eden的最大容量大小(KB) |
| EC | 当前新生代中Eden的容量大小(KB) |
| YGC | 从应用程序启动到采样时发生 Young GC 的次数 |
| FGC | 从应用程序启动到采样时发生 Full GC 的次数 |
-gcold
| 列名 | 说明 |
|---|---|
| PC | 当前持久代容量的大小(KB) |
| PU | 持久代使用容量的大小(KB) |
| OC | 当前老年代容量的大小(KB) |
| OU | 老年代使用容量的大小(KB) |
| YGC | 从应用程序启动到采样时发生 Young GC 的次数 |
| FGC | 从应用程序启动到采样时发生 Full GC 的次数 |
| FGCT | 从应用程序启动到采样时 Full GC 所用的时间(单位秒) |
| GCT | 从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC |
-gcoldcapacity
| 列名 | 说明 |
|---|---|
| OGCMN | 老生代的最小容量大小(KB) |
| OGCMX | 老生代的最大容量大小(KB) |
| OGC | 当前老生代的容量大小(KB) |
| OC | 当前新生代的空间容量大小(KB) |
| YGC | 从应用程序启动到采样时发生 Young GC 的次数 |
| FGC | 从应用程序启动到采样时发生 Full GC 的次数 |
| FGCT | 从应用程序启动到采样时 Full GC 所用的时间(单位秒) |
| GCT | 从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC |
-gcpermcapacity
从应用程序启动到采样时发生 Full GC 的次数
| 列名 | 说明 |
|---|---|
| PGCMN | 持久代的最小容量大小(KB) |
| PGCMX | 持久代的最大容量大小(KB) |
| PGC | 当前持久代的容量大小(KB) |
| PC | 当前持久代的空间容量大小(KB) |
| YGC | 从应用程序启动到采样时发生 Young GC 的次数 |
| FGC | |
| FGCT | 从应用程序启动到采样时 Full GC 所用的时间(单位秒) |
| GCT | 从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC |
-gcutil
| 列名 | 说明 |
|---|---|
| S0 | Heap上的 Survivor space 0 区已使用空间的百分比 |
| S1 | Heap上的 Survivor space 1 区已使用空间的百分比 |
| E | Heap上的 Eden space 区已使用空间的百分比 |
| O | Heap上的 Old space 区已使用空间的百分比 |
| P | Perm space 区已使用空间的百分比 |
| YGC | 从应用程序启动到采样时发生 Young GC 的次数 |
| YGCT | 从应用程序启动到采样时 Young GC 所用的时间(单位秒) |
| FGC | 从应用程序启动到采样时发生 Full GC 的次数 |
| FGCT | 从应用程序启动到采样时 Full GC 所用的时间(单位秒) |
| GCT | 从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC |
-printcompilation
| 列名 | 说明 |
|---|---|
| Compiled | 编译任务执行的次数 |
| Size | 方法的字节码所占的字节数 |
| Type | 编译类型 |
| Method | 指定确定被编译方法的类名及方法名,类名中使名“/”而不是“.”做为命名分隔符,方法名是被指定的类中的方法,这两个字段的格式是由HotSpot中的“-XX:+PrintComplation”选项确定的。 |
4、使用示例
示例1)、

示例2):

图中同时打印了young gc和full gc的总次数、总耗时。而,每次young gc消耗的时间,可以用相间隔的两行YGCT相减得到。每次full gc消耗的时间,可以用相隔的两行FGCT相减得到。例如红框中表示的第一行、第二行之间发生了1次young gc,消耗的时间为0.252-0.252=0.0秒。
常驻内存区(P)的使用率,始终停留在64.21%左右,说明常驻内存没有突变,比较正常。如果young gc和full gc能够正常发生,而且都能有效回收内存,常驻内存区变化不明显,则说明java内存释放情况正常,垃圾回收及时,java内存泄露的几率就会大大降低。但也不能说明一定没有内存泄露。
示例3)、

以上,介绍了Jstat按百分比查看gc情况的功能。其实,它还有功能,例如加载类信息统计功能、内存池信息统计功能等,那些是以绝对值的形式打印出来的,比较少用,在此就不做介绍。
示例4)、jstat -class pid:显示加载class的数量,及所占空间等信息。

示例5)、jstat -compiler pid:显示VM实时编译的数量等信息。

示例6)、查看远程服务器上的GC情况。
这个需要先在远程服务器上面开启jstatd服务,可以选看这里如何开启jstatd服务,http://blog.csdn.net/fenglibing/article/details/17323515
下面是一个执行示例:
C:\Documents and Settings\Administrator>jstat -gcutil
18272@the_ip:2021/jstatdName 1000
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 8.00 0.00 24.36 0 0.000 0 0.000 0.000
0.00 0.00 8.00 0.00 24.36 0 0.000 0 0.000 0.000
0.00 0.00 8.00 0.00 24.36 0 0.000 0 0.000 0.000
0.00 0.00 8.00 0.00 24.36 0 0.000 0 0.000 0.000
0.00 0.00 8.00 0.00 24.36 0 0.000 0 0.000 0.000
0.00 0.00 8.00 0.00 24.36 0 0.000 0 0.000 0.000
示例就不一一例举,有兴趣的可以自己尝试尝试。
jstat命令(Java Virtual Machine Statistics Monitoring Tool)的更多相关文章
- jps命令(Java Virtual Machine Process Status Tool)
1.介绍 用来查看基于HotSpot的JVM里面中,所有具有访问权限的Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java进程, ...
- JVM常用命令和性能调优建议 [Could not create the Java virtual machine]
一.查看jvm常用命令jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. ...
- Java 7 jstat – JVM Statistics Monitoring Tool【翻译】
原文地址:Java 7 jstat 本文内容 语法 参数 描述 虚拟机标识符 选项 一般选项 输出选项 示例 先发出来,然后慢慢翻译~ 语法 jstat [ generalOption | outpu ...
- Java虚拟机(Java Virtual Machine)
JVM(Java Virtual Machine),Java虚机机,是JDK最底层的东西.只要能将源代码编译成字节码(.class)文件,就可以由JVM在不同平台上解释成机器指令来执行.所以,Java ...
- JVM Specification 9th Edition (3) Chapter 2. The Structure of the Java Virtual Machine
Chapter 2. The Structure of the Java Virtual Machine 内容列表 2.1. The class File Format (class文件的格式) 2. ...
- Java Hour 58 Java Virtual Machine
每每谈到Java Virtual Machine, 你必须意识到这个有三种意思: 1 一个抽象的指南 2 一个具体的实现 3 一个运行时的实例 JVM 的生命周期 每个运行时JVM 实例都是为一个特定 ...
- Eclipse 4.6 Neon, could not create the java virtual machine
下了eclipse 4.6,打开报错:could not create the java virtual machine. a fatal exception has occurred. 命令行用 e ...
- Eclipse及Eclipse为基础的App报错“Failed to create the Java Virtual Machine”的解决办法
由于OracleJDK马上就要收费了,公司要求更换OpenJDK,结果安装后Eclipse及Eclipse为基础的App启动报错:“Failed to create the Java Virtual ...
- Android Studio Error -- Could not create the Java Virtual Machine
:app:dexDebug Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurre ...
随机推荐
- android使用属性动画代替补间动画
本文参考Android属性动画完全解析(上),初识属性动画的基本用法 android3.0之前一共有两种动画,分别是frame动画和tween动画,关于这两种动画如果不了解可以查看我之前的文章andr ...
- iOS开发中常用的手势---边缘手势
说明:以下方法是开发中使用的方法,有什么不对的或者好的方法,请多多指教! 此处的边缘手势是用来控制左侧抽屉视图的弹出以及收回. 添加手势 : 页面上有多个手势时需要遵循 UIGestureRecogn ...
- html不同文档类型支持的元素标签
- 使用 C# 编程对RTF文档的支持
http://www.68design.net/Development/Aspnet/Basis-AspNet/26011-1.html
- a标签的简单用法
1.href="#"的作用:页面中有滚动,可以直接回到顶部. <a href="#">回到最顶端</a> 2.href="ur ...
- 收集SQLServer线程等待信息
要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化的依据. sys.dm_os_wait_ ...
- O-C相关-03:面向对象概念的具体介绍
1.面向对象的概念 面向对象(object-oriented ;简称: OO) 至今还没有统一的概念,我这里把它定义为:按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世 ...
- 【转载】介绍“Razor”— ASP.NET的一个新视图引擎
最近在做一个项目,用的MVC razor 视图,因为之前没用这个视图做过,于是查阅文档资料,共享一下. https://msdn.microsoft.com/zh-cn/ff849693 内容主要是讲 ...
- Köln-keith jarrett
在火车上遇到一男生,带着他弟弟.他弟弟跑来跑去的,他就安稳地坐在下铺看书,不知道是哪种语言. 我们都是在北京下车. 第二天在王府井吃饭,姐姐带我吃西餐.我又看到他,跟一个阿姨一起吃饭. 吃饭的时候姐姐 ...
- java_反射_及其简单应用(2016-11-16)
话不多说直接上代码 接口: package bean; /** * user接口 */ public interface User { public String getName(); public ...