JVM 性能调优监控工具
Java自带工具
jps
JVM Process Status Tool,现实指定系统内所有的HotSpot虚拟机进程
用来查看基于HotSpot JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。
语法结构:
jps [options ] [ hostid ]
[options]选项 :
- -q: 输出VM标识符pid
- -m:输出main method的参数
- -l: 输出完全的包名,应用主类名,jar的完全路径名
- -v: 输出jvm参数
- -V: 输出通过flag文件传递到JVM中的参数
- -Joption:传递参数到vm,例如:-J-Xms512m
[hostid]:[protocol:][[//]hostname][:port][/servername]
如果不指定hostid就默认为当前主机或服务器
# jps -v
28815 start.jar -Djetty.home=/data/jetty -Djava.io.tmpdir=/tmp
30709 Jps -Denv.class.path=.:/data/java/jre/lib/rt.jar:/data/java/lib/dt.jar:/data/java/lib/tools.jar -Dapplication.home=/data/java -Xms8m
28851 XmlConfiguration -Xmx1000m -Xms1000m -Xmn512m -XX:PermSize=256m -verbose:gc -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintTenuringDistribution -XX:+PrintCommandLineFlags -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:ParallelCMSThreads=2 -XX:+CMSClassUnloadingEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=80 -Xloggc:logs/gc.log -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n -Djetty.home=/data/jetty -Djava.io.tmpdir=/dev/shm -Dorg.apache.jasper.compiler.disablejsr199=true
jstat
JVM Statistics Monitoring Tool,用于收集Hotspot虚拟机各个方面的运行参数
查看classloader,compiler,gc相关信息,实时监控资源和性能 。jstat工具特别强大,可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。
语法结构:
jstat -<option> [-t] [-h<lines>] <pid> [<interval> [<count>]]
- Options — 通常使用 -gcutil 查看gc情况
- interval – 间隔时间,单位为秒或者毫秒
- count — 打印次数,如果缺省则打印无数次
[options]选项 :
- class
显示加载class的数量,及所占空间等信息。
# jstat -class 21739 100 2
Loaded Bytes Unloaded Bytes Time
838 1708.1 0 0.0 0.98
838 1708.1 0 0.0 0.98
- compiler
显示VM实时编译的数量等信息。
# jstat -compiler 21739 100 2
Compiled Failed Invalid Time FailedType FailedMethod
43 0 0 0.52 0
43 0 0 0.52 0
- gc
显示gc的信息,查看gc的次数,及时间。
# jstat -gc 21739 100 10
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
2496.0 2496.0 0.0 0.0 15424.0 8208.7 40960.0 0.0 21248.0 5381.4 0 0.000 0 0.000 0.000
2496.0 2496.0 0.0 0.0 15424.0 8208.7 40960.0 0.0 21248.0 5381.4 0 0.000 0 0.000 0.000
2496.0 2496.0 0.0 0.0 15424.0 8208.7 40960.0 0.0 21248.0 5381.4 0 0.000 0 0.000 0.000
2496.0 2496.0 0.0 0.0 15424.0 8208.7 40960.0 0.0 21248.0 5381.4 0 0.000 0 0.000 0.000
2496.0 2496.0 0.0 0.0 15424.0 8208.7 40960.0 0.0 21248.0 5381.4 0 0.000 0 0.000 0.000
2496.0 2496.0 0.0 0.0 15424.0 8208.7 40960.0 0.0 21248.0 5381.4 0 0.000 0 0.000 0.000
2496.0 2496.0 0.0 0.0 15424.0 8208.7 40960.0 0.0 21248.0 5381.4 0 0.000 0 0.000 0.000
2496.0 2496.0 0.0 0.0 15424.0 8208.7 40960.0 0.0 21248.0 5381.4 0 0.000 0 0.000 0.000
2496.0 2496.0 0.0 0.0 15424.0 8208.7 40960.0 0.0 21248.0 5381.4 0 0.000 0 0.000 0.000
2496.0 2496.0 0.0 0.0 15424.0 8208.7 40960.0 0.0 21248.0 5381.4 0 0.000 0 0.000 0.000
参数 | 说明 |
---|---|
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
显示VM内存中三代(young,old,perm)对象的使用和占用大小
# jstat -gccapacity 21739 100 2
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC
20416.0 327680.0 20416.0 2496.0 2496.0 15424.0 40960.0 655360.0 40960.0 40960.0 21248.0 83968.0 21248.0 21248.0 0 0
20416.0 327680.0 20416.0 2496.0 2496.0 15424.0 40960.0 655360.0 40960.0 40960.0 21248.0 83968.0 21248.0 21248.0 0 0
- gcutil
统计gc信息
# jstat -gcutil 21739 100 10
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 53.22 0.00 25.33 0 0.000 0 0.000 0.000
0.00 0.00 53.22 0.00 25.33 0 0.000 0 0.000 0.000
0.00 0.00 53.22 0.00 25.33 0 0.000 0 0.000 0.000
0.00 0.00 53.22 0.00 25.33 0 0.000 0 0.000 0.000
0.00 0.00 53.22 0.00 25.33 0 0.000 0 0.000 0.000
0.00 0.00 53.22 0.00 25.33 0 0.000 0 0.000 0.000
0.00 0.00 53.22 0.00 25.33 0 0.000 0 0.000 0.000
0.00 0.00 53.22 0.00 25.33 0 0.000 0 0.000 0.000
0.00 0.00 53.22 0.00 25.33 0 0.000 0 0.000 0.000
0.00 0.00 53.22 0.00 25.33 0 0.000 0 0.000 0.000
参数 | 说明 |
---|---|
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 | 从应用程序启动到采样时用于垃圾回收的总时间(单位秒) |
- gcnew / gcnewcapacity
年轻代对象的信息(及其占用量)。
# jstat -gcnew 21739 100 2
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
2496.0 2496.0 0.0 0.0 15 15 0.0 15424.0 8208.7 0 0.000
2496.0 2496.0 0.0 0.0 15 15 0.0 15424.0 8208.7 0 0.000
# jstat -gcnewcapacity 21739 100 2
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
20416.0 327680.0 20416.0 109184.0 2496.0 109184.0 2496.0 327552.0 15424.0 0 0
20416.0 327680.0 20416.0 109184.0 2496.0 109184.0 2496.0 327552.0 15424.0 0 0
- gcold / gcoldcapacity
old代对象的信息(及其占用量)。
# jstat -gcold 21739 100 2
PC PU OC OU YGC FGC FGCT GCT
21248.0 5381.4 40960.0 0.0 0 0 0.000 0.000
21248.0 5381.4 40960.0 0.0 0 0 0.000 0.000
# jstat -gcoldcapacity 21739 100 2
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
40960.0 655360.0 40960.0 40960.0 0 0 0.000 0.000
40960.0 655360.0 40960.0 40960.0 0 0 0.000 0.000
- gcpermcapacity
perm对象的信息及其占用量。
# jstat -gcpermcapacity 21739 100 2
PGCMN PGCMX PGC PC YGC FGC FGCT GCT
21248.0 83968.0 21248.0 21248.0 0 0 0.000 0.000
21248.0 83968.0 21248.0 21248.0 0 0 0.000 0.000
- printcompilation
当前VM执行的信息
# jstat -printcompilation 21739 100 2
Compiled Size Type Method
43 81 2 org/apache/commons/launcher/StreamConnector run
43 81 2 org/apache/commons/launcher/StreamConnector run
当前VM执行的信息。
jinfo
Configuration Info for Java,现实虚拟机配置信息
jinfo可以输出并修改运行时的java 进程的opts。用处比较简单,用于输出JAVA系统参数及命令行参数。
命令格式:
jinfo [option] pid
jmap
jmap用于生成堆转储快照(一般称为heapdump或者dump文件)。当然也可其他方法比如加参数-XX:+HeapDumpOnOutOfMemoryError
参数,在虚拟机OOM异常的之后自动生成dump文件,也可以通过-XX:+HeapDumpOnCtrlBreak
参数则可以使用Ctrl+Break键让虚拟机生成dump文件
jmap不仅能获取dump还可以查询finalize执行队列,java堆和永久代详细信息,空间使用率,当前用的是什么收集器等。
- jmap -heap pid
查看heap的概要信息,GC使用的算法、heap的配置及wise heap的使用情况.
# jmap -heap 21739
Attaching to process ID 21739, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.7-b01
using thread-local object allocation.
Parallel GC with 2 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1006632960 (960.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 15794176 (15.0625MB)
used = 8405680 (8.016281127929688MB)
free = 7388496 (7.0462188720703125MB)
53.22012367090249% used
From Space:
capacity = 2555904 (2.4375MB)
used = 0 (0.0MB)
free = 2555904 (2.4375MB)
0.0% used
To Space:
capacity = 2555904 (2.4375MB)
used = 0 (0.0MB)
free = 2555904 (2.4375MB)
0.0% used
PS Old Generation
capacity = 41943040 (40.0MB)
used = 0 (0.0MB)
free = 41943040 (40.0MB)
0.0% used
PS Perm Generation
capacity = 21757952 (20.75MB)
used = 5510576 (5.2552947998046875MB)
free = 16247376 (15.494705200195312MB)
25.32672192676958% used
1654 interned Strings occupying 124952 bytes.
- jmap -histo[:live] pid
打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
# jmap -histo:live 21739
num #instances #bytes class name
----------------------------------------------
1: 10450 1459744 <constMethodKlass>
2: 10450 1426864 <methodKlass>
3: 1555 984208 [B
4: 838 972256 <constantPoolKlass>
5: 756 623200 <constantPoolCacheKlass>
6: 838 616368 <instanceKlassKlass>
7: 2750 287800 [C
8: 917 111752 java.lang.Class
9: 1249 84440 [S
10: 1257 71960 [[I
11: 2646 63504 java.lang.String
12: 734 41760 [I
13: 83 39352 <methodDataKlass>
- jmap -dump:live,format=b,file=
使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件,再 用jhat、MAT、VisualVM分析查看,以便查找内存溢出原因
# jmap -dump:live,format=b,file=cache.dump.bin 21739
Dumping heap to /data/log/task/cache.dump.bin ...
Heap dump file created
- finalizerinfo
打印正等候回收的对象的信息
# jmap -finalizerinfo 21739
Attaching to process ID 21739, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.7-b01
Number of objects pending for finalization: 0
- heap
打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
# jmap -heap 21739
Attaching to process ID 21739, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.7-b01
using thread-local object allocation.
Parallel GC with 2 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1006632960 (960.0MB)
NewSize = 1310720 (1.25MB)
MaxNewSize = 17592186044415 MB
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 21757952 (20.75MB)
MaxPermSize = 85983232 (82.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 15794176 (15.0625MB)
used = 0 (0.0MB)
free = 15794176 (15.0625MB)
0.0% used
From Space:
capacity = 2555904 (2.4375MB)
used = 0 (0.0MB)
free = 2555904 (2.4375MB)
0.0% used
To Space:
capacity = 2555904 (2.4375MB)
used = 0 (0.0MB)
free = 2555904 (2.4375MB)
0.0% used
PS Old Generation
capacity = 16711680 (15.9375MB)
used = 863536 (0.8235321044921875MB)
free = 15848144 (15.113967895507812MB)
5.167260263480392% used
PS Perm Generation
capacity = 21757952 (20.75MB)
used = 5511296 (5.2559814453125MB)
free = 16246656 (15.4940185546875MB)
25.33003106174699% used
1511 interned Strings occupying 115696 bytes.
- permstat
打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.
# jmap -permstat 21739
Attaching to process ID 21739, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.7-b01
finding class loader instances ..none
null_check
null_assert
range_check
class_check
array_check
intrinsic
bimorphic
unloaded
uninitialized
unreached
unhandled
constraint
div0_check
age
predicate
loop_limit_check
done.
computing per loader stat ..done.
please wait.. computing liveness...................................liveness analysis may be inaccurate ...
class_loader classes bytes parent_loader alive? type
<bootstrap> 700 4402352 null live <internal>
0x00000000c4061630 257 1960584 0x00000000c401ffd8 live java/net/[email protected]
0x00000000c4020028 0 0 null live sun/misc/[email protected]
0x00000000c401ffd8 20 302096 0x00000000c4020028 live sun/misc/[email protected]
total = 4 977 6665032 N/A alive=4, dead=0 N/A
- F
强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效
jstack
jstack用于生成java虚拟机当前时刻的线程快照,主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
语法:
jstack [ option ] pid
-F 当 jstack [-l] pid 没有响应的时候强制打印栈信息
-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m 打印java和native c/c++框架的所有栈信息.
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多
例如 如何找到 Java 进程中哪个线程占用了大量 CPU 处理时间 就是通过jstack定位的
jhat
JVM heap Dunp Browser,用于分析heapdump文件,他会建立一个HTTP/HTML服务,让用户可通过浏览器查看
jhat是sun提供的dump分析工具,上面讲过分析dump的工具还有MAT( Eclipse Memory Analyzer tool)、IBM HeapAnalyzer等,一般这个命令不太用到,是因为分析dump是个既耗时又耗机器资源的过程,第二个原因是这个工具比较简陋,没有MAT( Eclipse Memory Analyzer tool)、IBM HeapAnalyzer这些专业和强大。
所以直接通过jmap dump内存,然后通过工具来分析