不同的jstat参数输出不同类型的列,如下表所示,根据你使用的”jstat option”会输出不同列的信息。
| 列 | 说明 | Jstat参数 |
| S0C | 输出Survivor0空间的大小。单位KB。 |
-gc -gccapacity -gcnew -gcnewcapacity |
| S1C | 输出Survivor1空间的大小。单位KB。 |
-gc -gccapacity -gcnew -gcnewcapacity |
| S0U | 输出Survivor0已用空间的大小。单位KB。 |
-gc -gcnew |
| S1U | 输出Survivor1已用空间的大小。单位KB。 |
-gc -gcnew |
| EC | 输出Eden空间的大小。单位KB。 |
-gc -gccapacity -gcnew -gcnewcapacity |
| EU | 输出Eden已用空间的大小。单位KB。 |
-gc -gcnew |
| OC | 输出老年代空间的大小。单位KB。 |
-gc -gccapacity -gcold -gcoldcapacity |
| OU | 输出老年代已用空间的大小。单位KB。 |
-gc -gcold |
| PC | 输出持久代空间的大小。单位KB。 |
-gc -gccapacity -gcold -gcoldcapacity -gcpermcapacity |
| PU | 输出持久代已用空间的大小。单位KB。 |
-gc -gcold |
| YGC | 新生代空间GC时间发生的次数。 |
-gc -gccapacity -gcnew -gcnewcapacity -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccause |
| YGCT | 新生代GC处理花费的时间。 |
-gc -gcnew -gcutil -gccause |
| FGC | full GC发生的次数。 |
-gc -gccapacity -gcnew -gcnewcapacity -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccause |
| FGCT | full GC操作花费的时间 |
-gc -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccause |
| GCT | GC操作花费的总时间。 |
-gc -gcold -gcoldcapacity -gcpermcapacity -gcutil -gccause |
| NGCMN | 新生代最小空间容量,单位KB。 |
-gccapacity -gcnewcapacity |
| NGCMX | 新生代最大空间容量,单位KB。 |
-gccapacity -gcnewcapacity |
| NGC | 新生代当前空间容量,单位KB。 |
-gccapacity -gcnewcapacity |
| OGCMN | 老年代最小空间容量,单位KB。 |
-gccapacity -gcoldcapacity |
| OGCMX | 老年代最大空间容量,单位KB。 |
-gccapacity -gcoldcapacity |
| OGC | 老年代当前空间容量制,单位KB。 |
-gccapacity -gcoldcapacity |
| PGCMN | 持久代最小空间容量,单位KB。 |
-gccapacity -gcpermcapacity |
| PGCMX | 持久代最大空间容量,单位KB。 |
-gccapacity -gcpermcapacity |
| PGC | 持久代当前空间容量,单位KB。 |
-gccapacity -gcpermcapacity |
| PC | 持久代当前空间大小,单位KB |
-gccapacity -gcpermcapacity |
| PU | 持久代当前已用空间大小,单位KB |
-gc -gcold |
| LGCC | 最后一次GC发生的原因 | -gccause |
| GCC | 当前GC发生的原因 | -gccause |
| TT | 老年化阈值。被移动到老年代之前,在新生代空存活的次数。 | -gcnew |
| MTT | 最大老年化阈值。被移动到老年代之前,在新生代空存活的次数。 | -gcnew |
| DSS | 幸存者区所需空间大小,单位KB。 | -gcnew |
jstat 的好处是它可以持续的监控GC操作数据,不论Java应用是运行在本地还是远程,只要有控制台的地方就可以使用。当使用–gcutil 会输出如下信息。在GC优化的时候,你需要特别注意YGC, YGCT, FGC, FGCT 和GCT。
|
1
2
3
4
|
S0 S1 E O P YGC YGCT FGC FGCT GCT0.00 66.44 54.12 10.58 86.63 217 0.928 2 0.067 0.9950.00 66.44 54.12 10.58 86.63 217 0.928 2 0.067 0.9950.00 66.44 54.12 10.58 86.63 217 0.928 2 0.067 0.995 |
这些信息很重要,因为它们展示了GC处理到底花费了多少时间。
在这个例子中,YGC 是217而YGCT 是0.928,这样在简单的计算数据平均数后,你可以知道每次新生代的GC大概需要4ms(0.004秒),而full GC的平均时间为33ms。
但是,只看数据平均数经常无法分析出真正的GC问题。这是主要是因为GC操作时间严重的偏差(换句话说,假如两次full GC的时间是 67ms,那么其中的一次full GC可能执行了10ms而另一个可能执行了57ms。)为了更好地检测每次GC处理时间,最好使用 –verbosegc来替代数据平均数。
-verbosegc
-verbosegc 是在启动一个Java应用时可以指定的JVM参数之一。而jstat 可以监控任何JVM应用,即便它没有制定任何参数。 -verbosegc 需要在启动的时候指定,因此你可能会认为它没有必要(因为jstat可以替代之)。但是, -verbosegc 会以更浅显易懂的方式展现GC发生的结果,因此他对于监控监控GC信息十分有用。
| jstat | -verbosegc | |
| 监控对象 | 运行在本机的Java应用可以把日志输出到终端上,或者借助jstatd命令通过网络连接远程的Java应用。 | 只有那些把-verbogc作为启动参数的JVM。 |
| 输出信息 | 堆状态(已用空间,最大限制,GC执行次数/时间,等等) | 执行GC前后新生代和老年代空间大小,GC执行时间。 |
| 输出时间 |
Every designated time 每次设定好的时间。 | 每次GC发生的时候。 |
| 何时有用。 | 当你试图观察堆空间变化情况 | 当你试图了解单次GC产生的效果。 |
下面是-verbosegc 的可用参数
· -XX:+PrintGCDetails
· -XX:+PrintGCTimeStamps
· -XX:+PrintHeapAtGC
· -XX:+PrintGCDateStamps (from JDK 6 update 4)
如果只是用了 -verbosegc 。那么默认会加上 -XX:+PrintGCDetails。 –verbosgc 的附加参数并不是独立的。而是经常组合起来使用。
使用 –verbosegc后,每次GC发生你都会看到如下格式的结果。
[GC [<collector>: <starting occupancy1> -> <ending occupancy1>, <pause time1> secs] <starting occupancy3> -> <ending occupancy3>, <pause time3> secs]
| 收集器 | minor gc使用的收集器的名字。 |
| starting occupancy1 | GC执行前新生代空间大小。 |
| ending occupancy1 | GC执行后新生代空间大小。 |
| pause time1 | 因为执行minor GC,Java应用暂停的时间。 |
| starting occupancy3 | GC执行前堆区域总大小 |
| ending occupancy3 | GC执行后堆区域总大小 |
| pause time3 | Java应用由于执行堆空间GC(包括major GC)而停止的时间。 |
这是-verbosegc 输出的minor GC的例子。
|
1
2
3
4
|
S0 S1 E O P YGC YGCT FGC FGCT GCT0.00 66.44 54.12 10.58 86.63 217 0.928 2 0.067 0.9950.00 66.44 54.12 10.58 86.63 217 0.928 2 0.067 0.9950.00 66.44 54.12 10.58 86.63 217 0.928 2 0.067 0.995 |
本文详细介绍了jstat工具的不同参数及其输出信息,并对比了-verbosegc参数的应用场景及输出内容,帮助读者理解如何利用这两种方式监测Java虚拟机中的垃圾回收行为。
5万+

被折叠的 条评论
为什么被折叠?



