JVM调优工具集 -- jps, jstat, jinfo, jmap, jstack

来源:互联网 发布:ubuntu常用软件推荐 编辑:程序博客网 时间:2024/05/10 00:20

JDK自带了很多JVM工具,命令行工具主要有jps, jstat, jinfo, jmap, jstack

1) jps

用于找出某个JVM的ID号,其他命令基本都要依赖这个命令来定位某个JVM进程,例如:

E:\>jps
6008
16520
7616 JConsole
14908 jboss-modules.jar
12552 Jps

23908 Bootstrap

2) jstat

用于监视虚拟机各种运行状态信息,可以显示JVM的类装载,内存,GC等数据,是运行期定位JVM性能问题的首选工具。

使用方法:

jstat  [ option vmid [interval [count] ] ]

参数介绍:

参数名称

描述

gc

输出每个堆区域的当前可用空间以及已用空间(伊甸园,幸存者等等),GC执行的总次数,GC操作累计所花费的时间。

gccapactiy

输出每个堆区域的最小空间限制(ms)/最大空间限制(mx),当前大小,每个区域之上执行GC的次数。(不输出当前已用空间以及GC执行时间)。

gccause

输出-gcutil提供的信息以及最后一次执行GC的发生原因和当前所执行的GC的发生原因

gcnew

输出新生代空间的GC性能数据

gcnewcapacity

输出新生代空间的大小的统计数据。

gcold

输出老年代空间的GC性能数据。

gcoldcapacity

输出老年代空间的大小的统计数据。

gcpermcapacity

输出持久带空间的大小的统计数据。

gcutil

输出每个堆区域使用占比,以及GC执行的总次数和GC操作所花费的时间。


例如,执行”jstat –gc 14908 1000″ (或 1s)会每隔一秒展示GC监控数据。”jstat –gc 14908 1000 5″会每隔1秒展现一次,且一共5次。vmid后不加参数表示只输出一条记录。

E:\>jstat -gc 14908
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT
12672.0 12672.0  0.0   2488.8 101888.0 61064.0   253828.0   152296.3  116736.0 116637.1    289    8.253  25     32.975   41.229


E:\>jstat -gc 14908 1000 5
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       PC     PU    YGC     YGCT    FGC    FGCT     GCT
12672.0 12672.0  0.0   2488.8 101888.0 63285.7   253828.0   152296.3  116736.0 116637.1    289    8.253  25     32.975   41.229
12672.0 12672.0  0.0   2488.8 101888.0 63285.7   253828.0   152296.3  116736.0 116637.1    289    8.253  25     32.975   41.229
12672.0 12672.0  0.0   2488.8 101888.0 63285.7   253828.0   152296.3  116736.0 116637.1    289    8.253  25     32.975   41.229
12672.0 12672.0  0.0   2488.8 101888.0 63285.7   253828.0   152296.3  116736.0 116637.1    289    8.253  25     32.975   41.229
12672.0 12672.0  0.0   2488.8 101888.0 63285.7   253828.0   152296.3  116736.0 116637.1    289    8.253  25     32.975   41.229

数据结果介绍:

列说明Jstat参数S0C输出Survivor0空间的大小。单位KB。-gc
-gccapacity
-gcnew
-gcnewcapacityS1C输出Survivor1空间的大小。单位KB。-gc
-gccapacity
-gcnew
-gcnewcapacityS0U输出Survivor0已用空间的大小。单位KB。-gc
-gcnewS1U输出Survivor1已用空间的大小。单位KB。-gc
-gcnewEC输出Eden空间的大小。单位KB。-gc
-gccapacity
-gcnew
-gcnewcapacityEU输出Eden已用空间的大小。单位KB。-gc
-gcnewOC输出老年代空间的大小。单位KB。-gc
-gccapacity
-gcold
-gcoldcapacityOU输出老年代已用空间的大小。单位KB。-gc
-gcoldPC输出持久代空间的大小。单位KB。-gc
-gccapacity
-gcold
-gcoldcapacity
-gcpermcapacityPU输出持久代已用空间的大小。单位KB。-gc
-gcoldYGC新生代空间GC时间发生的次数。-gc
-gccapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-gccauseYGCT新生代GC处理花费的时间。-gc
-gcnew
-gcutil
-gccauseFGCfull GC发生的次数。-gc
-gccapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-gccauseFGCTfull GC操作花费的时间-gc
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-gccauseGCTGC操作花费的总时间。-gc
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-gccauseNGCMN新生代最小空间容量,单位KB。-gccapacity
-gcnewcapacityNGCMX新生代最大空间容量,单位KB。-gccapacity
-gcnewcapacityNGC新生代当前空间容量,单位KB。-gccapacity
-gcnewcapacityOGCMN老年代最小空间容量,单位KB。-gccapacity
-gcoldcapacityOGCMX老年代最大空间容量,单位KB。-gccapacity
-gcoldcapacityOGC老年代当前空间容量制,单位KB。-gccapacity
-gcoldcapacityPGCMN持久代最小空间容量,单位KB。-gccapacity
-gcpermcapacityPGCMX持久代最大空间容量,单位KB。-gccapacity
-gcpermcapacityPGC持久代当前空间容量,单位KB。-gccapacity
-gcpermcapacityPC持久代当前空间大小,单位KB-gccapacity
-gcpermcapacityPU持久代当前已用空间大小,单位KB-gc
-gcoldLGCC最后一次GC发生的原因-gccauseGCC当前GC发生的原因-gccauseTT老年化阈值。被移动到老年代之前,在新生代空存活的次数。-gcnewMTT最大老年化阈值。被移动到老年代之前,在新生代空存活的次数。-gcnewDSS幸存者区所需空间大小,单位KB。-gcnew


3) jinfo

可以实时查看和调整虚拟机的各项参数。如果是1.6及以上的JDK,也可以使用java -XX:+PrintFlagsFinal查看参数。

jinfo可以使用-flag [+|-]name或者 -flag name=value来在运行期修改JVM参数。

命令格式:

jinfo [option] pid

执行查询示例:

[as@internal01 ~]$ jinfo -flag HeapDumpOnOutOfMemoryError 29685
-XX:-HeapDumpOnOutOfMemoryError

执行动态修改,首先看看哪些参数是允许动态修改的

[as@internal01 ~]$ java -XX:+PrintFlagsFinal | grep manageable
     intx CMSAbortablePrecleanWaitMillis            = 100             {manageable}
     intx CMSWaitDuration                                      = 2000            {manageable}
     bool HeapDumpAfterFullGC                            = false           {manageable}
     bool HeapDumpBeforeFullGC                      = false           {manageable}
     bool HeapDumpOnOutOfMemoryError                = false           {manageable}
     ccstr HeapDumpPath                              =                 {manageable}
     bool PrintClassHistogram                       = false           {manageable}
     bool PrintClassHistogramAfterFullGC            = false           {manageable}
     bool PrintClassHistogramBeforeFullGC           = false           {manageable}
     bool PrintConcurrentLocks                      = false           {manageable}
     bool PrintGC                                   = false           {manageable}
     bool PrintGCDateStamps                         = false           {manageable}
     bool PrintGCDetails                            = false           {manageable}
     bool PrintGCTimeStamps                         = false           {manageable}

执行动态修改:

[as@internal01 ~]$ jinfo -flag +HeapDumpOnOutOfMemoryError 29685
[as@internal01 ~]$ jinfo -flag HeapDumpOnOutOfMemoryError 29685
-XX:+HeapDumpOnOutOfMemoryError


[as@internal01 ~]$ jinfo -flag HeapDumpPath=/opt/las/bill.dump 29685
[as@internal01 ~]$ jinfo -flag HeapDumpPath 29685
-XX:HeapDumpPath=/opt/las/bill.dump


4) jmap

主要用于生成堆转储快照(一般称为heapdump或dump文件),还可以查询finalize执行队列,Java堆和永久代的信息。

命令格式: jmap [option] vmid

常用选项:

-dump : 生成Java对转储快照。格式为:-dump:[live,] format=b,file=<filename>, 其中live子参数说明是否只dump出存活的对象。

-histo:    显示对中对象统计信息,包括类、实例数量和合计容量。


例如:

C:\Users\b001>jmap -dump:format=b,file=D:\dump.bin 2200
Dumping heap to D:\dump.bin ...
Heap dump file created

生成的快照可以用MAT或者visualvm等工具分析。


5) jstack

用于生成JVM在当前时刻的线程快照(一般称为threaddump或者javacore文件),线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待。

另外,JDK1.5中,java.lang.Thread新增了一个getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象,可以完成jstack的大部分功能。



参考文献:

1) http://www.importnew.com/2057.html

2) 深入理解Java虚拟机:JVM高级特性与最佳实践







0 0