Java学习笔记49:Java监控常用工具

Java的安装包自带了很多优秀的工具,善用这些工具对于监控和调试Java程序非常有帮助。常用工具如下:

jps

用途:jps用来查看JVM里面所有进程的具体状态,包括进程ID,进程启动的路径等等。

常用参数:

-l: 输出完成的包名称;

-m: 输出程序的命令行输入参数;

-v: 输出完整的JVM参数。

jstack

用途:1)查看java程序崩溃生成core文件,获得core文件的javastack和nativestack的信息;2)查看正在运行的java程序的javastack和nativestack的信息:a) 查看运行的java程序呈现hung的状态;b) 跟踪Java的调用栈,剖析程序。

jinfo

用途:jinfo可观察运行中的java程序的运行环境参数:参数包括JavaSystem属性和JVM命令行参数;也可从core文件里面知道崩溃的Java应用程序的配置信息。

jstat

用途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>

jmap

用途观察运行中的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

你可能感兴趣的:(Java学习)