Java的安装包自带了很多优秀的工具,善用这些工具对于监控和调试Java程序非常有帮助。常用工具如下:
用途:jps用来查看JVM里面所有进程的具体状态,包括进程ID,进程启动的路径等等。
常用参数:
-l: 输出完成的包名称;
-m: 输出程序的命令行输入参数;
-v: 输出完整的JVM参数。
用途:1)查看java程序崩溃生成core文件,获得core文件的javastack和nativestack的信息;2)查看正在运行的java程序的javastack和nativestack的信息:a) 查看运行的java程序呈现hung的状态;b) 跟踪Java的调用栈,剖析程序。
用途:jinfo可观察运行中的java程序的运行环境参数:参数包括JavaSystem属性和JVM命令行参数;也可从core文件里面知道崩溃的Java应用程序的配置信息。
用途:jstat利用了JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heapsize和垃圾回收状况的监控等等。
语法结构:
Usage:jstat-help|-options
jstat-<option>[-t][-h<lines>]<vmid>[<interval>[<count>]]
参数解释:
Options—选项,我们一般使用-gcutil查看gc情况
vmid—VM的进程号,即当前运行的java进程号
interval–间隔时间,单位为秒或者毫秒
count—打印次数,如果缺省则打印无数次
具体option参数如下:
-class:统计classloader行为信息
-compile:统计编译行为信息
-gc:统计jdkgc时heap信息
-gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况
-gccause:统计gc的情况,(同-gcutil)和引起gc的事件
-gcnew:统计gc时,新生代的情况
-gcnewcapacity:统计gc时,新生代heap容量
-gcold:统计gc时,老年区的情况
-gcoldcapacity:统计gc时,老年区heap容量
-gcpermcapacity:统计gc时,permanent区heap容量
-gcutil:统计gc时,heap情况
输出内容含义如下:
S0—Heap上的Survivorspace0区已使用空间的百分比
S1—Heap上的Survivorspace1区已使用空间的百分比
E—Heap上的Edenspace区已使用空间的百分比
O—Heap上的Oldspace区已使用空间的百分比
P—Permspace区已使用空间的百分比
YGC—从应用程序启动到采样时发生YoungGC的次数
YGCT–从应用程序启动到采样时YoungGC所用的时间(单位秒)
FGC—从应用程序启动到采样时发生FullGC的次数
FGCT–从应用程序启动到采样时FullGC所用的时间(单位秒)
GCT—从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
示例
实例使用1:
[root@localhostbin]#jstat-gcutil25444
S0S1EOPYGCYGCTFGCFGCTGCT
11.630.0056.4666.9298.491620.24860.3310.579
实例使用2:
[root@localhostbin]#jstat-gcutil2544410005
S0S1EOPYGCYGCTFGCFGCTGCT
73.540.0099.0467.5298.491660.25260.3310.583
73.540.0099.0467.5298.491660.25260.3310.583
73.540.0099.0467.5298.491660.25260.3310.583
73.540.0099.0467.5298.491660.25260.3310.583
73.540.0099.0467.5298.491660.25260.3310.583
我们可以看到,5次younggc之后,垃圾内存被从Edenspace区(E)放入了Oldspace区(O),并引起了百分比的变化,导致Survivorspace使用的百分比从73.54%(S0)降到0%(S1)。有效释放了内存空间。绿框中,我们可以看到,一次fullgc之后,Oldspace区(O)的内存被回收,从99.05%降到67.52%。
图中同时打印了younggc和fullgc的总次数、总耗时。而,每次younggc消耗的时间,可以用相间隔的两行YGCT相减得到。每次fullgc消耗的时间,可以用相隔的两行FGCT相减得到。例如红框中表示的第一行、第二行之间发生了1次younggc,消耗的时间为0.252-0.252=0.0秒。
常驻内存区(P)的使用率,始终停留在98.49%左右,说明常驻内存没有突变,比较正常。
如果younggc和fullgc能够正常发生,而且都能有效回收内存,常驻内存区变化不明显,则说明java内存释放情况正常,垃圾回收及时,java内存泄露的几率就会大大降低。但也不能说明一定没有内存泄露。
GCT是YGCT和FGCT的时间总和。
以上,介绍了Jstat按百分比查看gc情况的功能。其实,它还有功能,例如加载类信息统计功能、内存池信息统计功能等,那些是以绝对值的形式打印出来的,比较少用,在此就不做介绍。
[root@localhostbin]#ps-ef|grepjava
root259171223:23pts/200:00:05/usr/local/jdk1.5/bin/java-Djava.endorsed.dirs=/usr/local/jakarta-tomcat-5.0.30/common/endorsed-classpath/usr/local/jdk1.5/lib/tools.jar:/usr/local/jakarta-tomcat-5.0.30/bin/bootstrap.jar:/usr/local/jakarta-tomcat-5.0.30/bin/commons-logging-api.jar-Dcatalina.base=/usr/local/jakarta-tomcat-5.0.30-Dcatalina.home=/usr/local/jakarta-tomcat-5.0.30-Djava.io.tmpdir=/usr/local/jakarta-tomcat-5.0.30/temporg.apache.catalina.startup.Bootstrapstart
jstat-classpid:显示加载class的数量,及所占空间等信息。
实例使用3:
[root@localhostbin]#jstat-class25917
LoadedBytesUnloadedBytesTime
26292916.82924.60.90
jstat-compilerpid:显示VM实时编译的数量等信息。
实例使用4:
[root@localhostbin]#jstat-compiler25917
CompiledFailedInvalidTimeFailedTypeFailedMethod
768000.700
jstat–gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推,OC是old内纯的占用量。
[root@localhostbin]#jstat-gccapacity25917
NGCMN640.0
NGCMX4992.0
NGC832.0
S0C64.0
S1C64.0
EC704.0
OGCMN1408.0
OGCMX60544.0
OGC9504.0
OC9504.0OC是old内纯的占用量
PGCMN8192.0PGCMN显示的是最小perm的内存使用量
PGCMX65536.0PGCMX显示的是perm的内存最大使用量
PGC12800.0PGC是当前新生成的perm内存占用量
PC12800.0PC是但前perm内存占用量
YGC164
FGC6
jstat-gcnewpid:new对象的信息
[root@localhostbin]#jstat-gcnew25917
S0CS1CS0US1UTTMTTDSSECEUYGCYGCT
64.064.047.40.021532.0704.0145.71680.254
jstat-gcnewcapacitypid:new对象的信息及其占用量
[root@localhostbin]#jstat-gcnewcapacity25917
NGCMNNGCMXNGCS0CMXS0CS1CMXS1CECMXECYGCFGC
640.04992.0832.064.0448.0448.064.04096.0704.01686
jstat-gcoldpid:old对象的信息。
[root@localhostbin]#jstat-gcold25917
PCPUOCOUYGCFGCFGCTGCT
12800.012617.69504.06561.316960.3350.591
jstat-gcoldcapacitypid:old对象的信息及其占用量。
[root@localhostbin]#jstat-gcoldcapacity25917
OGCMNOGCMXOGCOCYGCFGCFGCTGCT
1408.060544.09504.09504.016960.3350.591
jstat-gcpermcapacitypid:perm对象的信息及其占用量。
[root@localhostbin]#jstat-gcpermcapacity25917
PGCMNPGCMXPGCPCYGCFGCFGCTGCT
8192.065536.012800.012800.016960.3350.591
jstat-printcompilationpid:当前VM执行的信息。
[root@localhostbin]#jstat-printcompilation-h32591710005
每1000毫秒打印一次,一共打印5次,还可以加上-h3每三行显示一下标题。
CompiledSizeTypeMethod
788731java/io/File<init>
788731java/io/File<init>
788731java/io/File<init>
CompiledSizeTypeMethod
788731java/io/File<init>
788731java/io/File<init>
用途:观察运行中的jvm物理内存的占用情况,包括Heapsize,Permsize等等。
参数如下:
-heap:打印jvmheap的情况
-histo:打印jvmheap的直方图。其输出信息包括类名,对象数量,对象占用大小。
-histo:live:同上,但是只答应存活对象的情况
-permstat:打印permanentgenerationheap情况
命令使用:
jmap-heap2083 ----观察到NewGeneration(EdenSpace,FromSpace,ToSpace),tenuredgeneration,PermGeneration的内存使用情况
jmap-histo2083|jmap-histo:live2083 ----观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。
jmap -dump:live,format=b,file=heap.bin 2083 ----dump java heap in hprof binary format。输出文件可用于进一步分析。
class name对应的就是Class文件里的class的标识
B代表byte
C代表char
D代表double
F代表float
I代表int
J代表long
Z代表boolean
前边有[代表数组,[I 就相当于int[]
对象用[L+类名表示
BaseTypeCharacter | Type | Interpretation |
B | byte | signed byte |
C | char | Unicode character |
D | double | double-precision floating-point value |
F | float | single-precision floating-point value |
I | int | integer |
J | long | long integer |
L<classname>; | reference | an instance of class de><classname>de> |
S | short | signed short |
Z | boolean | de>truede> or de>falsede> |
[ | reference | one array dimension |