28 October 2013

jps

列出所有的jvm实例

1
2
3
4
    $ jps
    13877 Jps
    10019 Bootstrap
    4364 activemq.jar
1
    $ jps host

列出远程服务器上的JVM实例,采用RMI协议,默认连接端口为1099

jmap

用来显示Java进程的内存映射(也能分析Java core文件)

默认视图

jmap最简单的用法是查看连接到进程里的本地类库。除非你的应用程序里有很多JNI代码, 否则这种用法通常没什么用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ jmap 10019
    Attaching to process ID 10019, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 23.25-b01
    0x0000000000400000	7K	/home/microloan/software/jdk1.7.0_25/bin/java
    0x00000034c3e00000	153K	/lib64/ld-2.12.so
    0x00000034c4200000	1877K	/lib64/libc-2.12.so
    0x00000034c4600000	584K	/lib64/libm-2.12.so
    0x00000034c4a00000	22K	/lib64/libdl-2.12.so
    0x00000034c4e00000	142K	/lib64/libpthread-2.12.so
    0x00000034c5600000	45K	/lib64/librt-2.12.so
    0x00000034c6200000	111K	/lib64/libresolv-2.12.so
    0x00000034ce600000	91K	/lib64/libgcc_s-4.4.6-20110824.so.1
    0x00007f7880f42000	474K	/home/microloan/software/jdk1.7.0_25/jre/lib/amd64/libt2k.so
    0x00007f7881934000	490K	/home/microloan/software/jdk1.7.0_25/jre/lib/amd64/libfontmanager.so
    0x00007f78822b1000	26K	/lib64/libnss_dns-2.12.so
    0x00007f78884c1000	250K	/home/microloan/software/jdk1.7.0_25/jre/lib/amd64/libsunec.so
    0x00007f7888708000	36K	/home/microloan/software/jdk1.7.0_25/jre/lib/amd64/headless/libmawt.so
    0x00007f788890f000	759K	/home/microloan/software/jdk1.7.0_25/jre/lib/amd64/libawt.so
    0x00007f7888be2000	44K	/home/microloan/software/jdk1.7.0_25/jre/lib/amd64/libmanagement.so
    0x00007f7888dea000	107K	/home/microloan/software/jdk1.7.0_25/jre/lib/amd64/libnet.so
    0x00007f78901e3000	89K	/home/microloan/software/jdk1.7.0_25/jre/lib/amd64/libnio.so
    0x00007f789a4de000	120K	/home/microloan/software/jdk1.7.0_25/jre/lib/amd64/libzip.so
    0x00007f789a6f9000	64K	/lib64/libnss_files-2.12.so
    0x00007f789a91f000	214K	/home/microloan/software/jdk1.7.0_25/jre/lib/amd64/libjava.so
    0x00007f789ab4a000	63K	/home/microloan/software/jdk1.7.0_25/jre/lib/amd64/libverify.so
    0x00007f789ae59000	13190K	/home/microloan/software/jdk1.7.0_25/jre/lib/amd64/server/libjvm.so
    0x00007f789bb7c000	103K	/home/microloan/software/jdk1.7.0_25/jre/lib/amd64/jli/libjli.so

堆视图

使用-heap选项时,jmap会抓取进程当前的堆快照。在输出结果中能看到构成Java进程堆内存的基本参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
$ jmap -heap 10019
    Attaching to process ID 10019, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 23.25-b01
    
    using thread-local object allocation.
    Parallel GC with 4 thread(s)
    
    Heap Configuration:
       MinHeapFreeRatio = 40
       MaxHeapFreeRatio = 70
       MaxHeapSize      = 1073741824 (1024.0MB)
       NewSize          = 1310720 (1.25MB)
       MaxNewSize       = 17592186044415 MB
       OldSize          = 5439488 (5.1875MB)
       NewRatio         = 2
       SurvivorRatio    = 8
       PermSize         = 536870912 (512.0MB)
       MaxPermSize      = 536870912 (512.0MB)
       G1HeapRegionSize = 0 (0.0MB)
    
    Heap Usage:
    PS Young Generation
    Eden Space:
       capacity = 350093312 (333.875MB)
       used     = 274149616 (261.44944763183594MB)
       free     = 75943696 (72.42555236816406MB)
       78.30758446479548% used
    From Space:
       capacity = 3801088 (3.625MB)
       used     = 98304 (0.09375MB)
       free     = 3702784 (3.53125MB)
       2.586206896551724% used
    To Space:
       capacity = 3604480 (3.4375MB)
       used     = 0 (0.0MB)
       free     = 3604480 (3.4375MB)
       0.0% used
    PS Old Generation
       capacity = 715849728 (682.6875MB)
       used     = 209051048 (199.36661529541016MB)
       free     = 506798680 (483.32088470458984MB)
       29.20320282638984% used
    PS Perm Generation
       capacity = 536870912 (512.0MB)
       used     = 141163656 (134.62415313720703MB)
       free     = 395707256 (377.37584686279297MB)
       26.29377990961075% used
    
    36088 interned Strings occupying 3954552 bytes.

柱状视图

柱状视图显示了系统中每个类型的实例(还有一些内部实体)占用的内存量。各个类型按使 用内存多少排列,这样就比较容易看到最大的内存。
当然,如果所有内存都交给了框架和平台类,这里可能就没你什么事了。但如果真有一个你 的类,有了这些信息便能更好地干预它的内存占用。

$ jmap -histo 10019 head -30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
     num     #instances         #bytes  class name
    ----------------------------------------------
       1:        228765      175874592  [I
       2:        508052      129038624  [B
       3:        707707       71626144  [C
       4:        245171       37640784  <constMethodKlass>
       5:        245171       33355304  <methodKlass>
       6:         22498       25107264  <constantPoolKlass>
       7:         22498       17390320  <instanceKlassKlass>
       8:        651709       15641016  java.lang.String
       9:         18016       13946432  <constantPoolCacheKlass>
      10:         88801        7104080  java.lang.reflect.Method
      11:         74206        6517832  [Ljava.util.HashMap$Entry;
      12:        197260        6312320  java.util.HashMap$Entry
      13:        121133        4845320  java.util.LinkedHashMap$Entry
      14:        109182        4367280  java.util.HashMap$ValueIterator
      15:        159152        4024816  [Ljava.lang.String;
      16:         69208        3680112  [Ljava.lang.Object;
      17:         44330        3191760  java.util.regex.Pattern
      18:          5365        3107120  <methodDataKlass>
      19:         46070        2948480  java.util.regex.Matcher
      20:         24025        2875640  java.lang.Class
      21:         49420        2767520  java.util.HashMap
      22:        112061        2689464  java.io.File
      23:        109185        2620440  org.apache.catalina.LifecycleEvent
      24:         44025        2465400  [Ljava.util.regex.Pattern$GroupHead;
      25:        109184        2211856  [Lorg.apache.catalina.Container;
      26:         64608        2067456  java.util.concurrent.ConcurrentHashMap$HashEntry
      27:         39373        1961768  [[I

柱状图模式下还能看到其他有意思的事情,这次指定-histo:live选项。这是告诉jmap只 处理存活对象,而不是整个堆(jmap默认会处理所有对象,也包括还没被收集的垃圾)。让我们 看看这次输出什么:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    $ jmap -histo:live 10019|head -30
    
     num     #instances         #bytes  class name
    ----------------------------------------------
       1:         74512       47870936  [B
       2:        244687       37588560  <constMethodKlass>
       3:        244687       33289480  <methodKlass>
       4:        241228       31651544  [C
       5:         22264       24880992  <constantPoolKlass>
       6:         22264       17239360  <instanceKlassKlass>
       7:         17782       13773984  <constantPoolCacheKlass>
       8:        237034        5688816  java.lang.String
       9:        171257        5480224  java.util.HashMap$Entry
      10:         64024        5121920  java.lang.reflect.Method
      11:         51623        4688640  [Ljava.util.HashMap$Entry;
      12:          5364        3106664  <methodDataKlass>
      13:         23791        2849368  java.lang.Class
      14:         52890        2774632  [Ljava.lang.Object;
      15:         66549        2661960  java.util.LinkedHashMap$Entry
      16:         60908        1949056  java.util.concurrent.ConcurrentHashMap$HashEntry
      17:         37817        1892168  [[I
      18:         30760        1882104  [S
      19:         28266        1710304  [I
      20:         28325        1586200  java.util.HashMap
      21:         56713        1550616  [Ljava.lang.String;
      22:         19744        1263616  java.util.LinkedHashMap
      23:         24731        1187088  org.apache.catalina.loader.ResourceEntry
      24:         16361        1047104  java.net.URL
      25:         37258         894192  java.util.ArrayList
      26:         22105         884200  java.lang.ref.SoftReference
      27:          1510         869760  <objArrayKlassKlass>

注意输出的变化查看那些类是消耗内存的主要力量。

使用jmap时应该稍微谨慎点。进行该操作时JVM还在运行(如果你不走运,还有可能在读 取快照期间做了垃圾回收),所以你应该多运行几次,特别是在你看到任何奇怪或太好的结果时。

产生离线导出文件

1
    $ jmap -dump:live,format=b,file=heap.hprof 10019

导出结果可以用来做离线分析,可以留给jmap以后自己用,也可以留给Oracle的jhat等工具做高级分析.

VisualVM

VisualVM是Oracle JVM自带的可视化工具。它是插件架构,采用标准配置,比JConsole用起来更方便。

1
    $jvisualvm

如图所示: VisualVM



blog comments powered by Disqus