JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解 下载本文

内容发布更新时间 : 2024/5/17 12:28:34星期一 下面是文章的全部内容请认真阅读。

04 ---------------------------------------------- 05 1: 38445 5597736 06 2: 38445 5237288 07 3: 3500 3749504 08 4: 60858 3242600 09 5: 3500 2715264 10 6: 2796 2131424

11 7: 5543 1317400 [I 12 8: 13714 1010768 [C

13 9: 4752 1003344 [B

14 10: 1225 639656 15 11: 14194 454208 java.lang.String 16 12: 3809 396136 java.lang.Class

17 13: 4979 311952 [S 18 14: 5598 287064 [[I

19 15: 3028 266464 java.lang.reflect.Method 20 16: 280 163520 21 17: 4355 139360 java.util.HashMap$Entry 2 18: 1869 138568 [Ljava.util.HashMap$Entr

2 y;

2 19: 2443 97720 java.util.LinkedHashMap$3 Entry

24 20: 2072 82880 java.lang.ref.SoftReference 25 21: 1807 71528 [Ljava.lang.Object; 2 22: 2206 70592 java.lang.ref.WeakRefere6 nce

27 23: 934 52304 java.util.LinkedHashMap 2 24: 871 48776 java.beans.MethodDescrip8 tor

2 25: 1442 46144 java.util.concurrent.Conc9 urrentHashMap$HashEntry

3

0

26: 804 38592 java.util.HashMap 3 27: 948 37920 java.util.concurrent.Conc1 urrentHashMap$Segment

3 28: 1621 35696 [Ljava.lang.Class;

2

33 29: 1313 34880 [Ljava.lang.String; 3 30: 1396 33504 java.util.LinkedList$Ent4 ry

3

31: 462 33264 java.lang.reflect.Field 5

3 32: 1024 32768 java.util.Hashtable$Entr6 y

3 33: 948 31440 [Ljava.util.concurrent.Co7 ncurrentHashMap$HashEntry;

class name是对象类型,说明如下:

1 B byte 2 C char 3 D double 4 F float 5 I int 6 J long

7 Z boolean

8 [ 数组,如[I表示int[]

9 [L+类名 其他对象

还有一个很常用的情况是:用jmap把进程内存使用情况dump到文件中,再用jhat分析查看。jmap进行dump命令格式如下:

1 jmap -dump:format=b,file=dumpFileName

我一样地对上面进程ID为21711进行Dump:

root@ubuntu:/# jmap -dump:format=b,file=/tmp/dump.dat 21711

1

2 Dumping heap to /tmp/dump.dat ...

3 Heap dump file created

dump出来的文件可以用MAT、VisualVM等工具查看,这里用jhat查看:

01 root@ubuntu:/# jhat -port 9998 /tmp/dump.dat 02 Reading from /tmp/dump.dat...

03 Dump file created Tue Jan 28 17:46:14 CST 2014 04 Snapshot read, resolving...

05 Resolving 132207 objects...

06 Chasing references, expect 26 dots..........................

07 Eliminating duplicate references.......................... 08 Snapshot resolved.

09 Started HTTP server on port 9998 10 Server is ready.

然后就可以在浏览器中输入主机地址:9998查看了:

上面红线框出来的部分大家可以自己去摸索下,最后一项支持OQL(对象查询语言)。

D、jstat(JVM统计监测工具) 语法格式如下:

jstat [ generalOption | outputOptions vmid [interval[s|ms] [c1

ount]] ]

vmid是虚拟机ID,在Linux/Unix系统上一般就是进程ID。interval是采样时间间隔。count是采样数目。比如下面输出的是GC信息,采样时间间隔为250ms,采样数为4:

1 root@ubuntu:/# jstat -gc 21711 250 4

S0C S1C S0U S1U EC EU OC 2

OU PC PU YGC YGCT FGC FGCT GCT 192.0 192.0 64.0 0.0 6144.0 1854.9 32000.0 413 11.6 55296.0 25472.7 702 0.431 3 0.218 0.649

192.0 192.0 64.0 0.0 6144.0 1972.2 32000.0 414 11.6 55296.0 25472.7 702 0.431 3 0.218 0.649

192.0 192.0 64.0 0.0 6144.0 1972.2 32000.0 415 11.6 55296.0 25472.7 702 0.431 3 0.218 0.649

192.0 192.0 64.0 0.0 6144.0 2109.7 32000.0 416 11.6 55296.0 25472.7 702 0.431 3 0.218 0.649

要明白上面各列的意义,先看JVM堆内存布局:

可以看出:

1 堆内存 = 年轻代 + 年老代 + 永久代

2 年轻代 = Eden区 + 两个Survivor区(From和To)

现在来解释各列含义:

1 S0C、S1C、S0U、S1U:Survivor 0/1区容量(Capacity)和使用量(Used) 2 EC、EU:Eden区容量和使用量

3 OC、OU:年老代容量和使用量

4 PC、PU:永久代容量和使用量

5 YGC、YGT:年轻代GC次数和GC耗时 6 FGC、FGCT:Full GC次数和Full GC耗时

7 GCT:GC总耗时