JVM調優工具

JMap

首先要知道Java進程的pid。

Windows:

..

..

..

Linux:

ps -ef | grep java

查看堆棧信息(jmap -heap pid)

jmap -heap 8512
Attaching to process ID 8512, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12

using thread-local object allocation.
Parallel GC with 8 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 2128609280 (2030.0MB)
   NewSize                  = 44564480 (42.5MB)
   MaxNewSize               = 709361664 (676.5MB)
   OldSize                  = 89653248 (85.5MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 68157440 (65.0MB)
   used     = 57053032 (54.410011291503906MB)
   free     = 11104408 (10.589988708496094MB)
   83.70770967923679% used
From Space:
   capacity = 5242880 (5.0MB)
   used     = 3113008 (2.9687957763671875MB)
   free     = 2129872 (2.0312042236328125MB)
   59.37591552734375% used
To Space:
   capacity = 3670016 (3.5MB)
   used     = 0 (0.0MB)
   free     = 3670016 (3.5MB)
   0.0% used
PS Old Generation
   capacity = 89653248 (85.5MB)
   used     = 49152 (0.046875MB)
   free     = 89604096 (85.453125MB)
   0.05482456140350877% used

3998 interned Strings occupying 342784 bytes.

打印等待回收的對象信息(jmap -finalizerinfo pid)

jmap -finalizerinfo 8512
Attaching to process ID 8512, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
Number of objects pending for finalization: 0

 打印堆裏面對象的統計信息:對象數量、佔用大小、類名(jmap -histo:live pid | more)

jmap -histo:live 8512 | more

 num     #instances         #bytes  class name
----------------------------------------------
   1:          9728        1016408  [C
   2:          1650         303784  [B
   3:          9441         226584  java.lang.String
   4:          1821         205672  java.lang.Class
   5:          1285          92520  org.apache.zookeeper.data.StatPersisted
   6:          1735          87008  [Ljava.lang.Object;
   7:          2385          76320  java.util.HashMap$Node
   8:          2322          74304  java.util.concurrent.ConcurrentHashMap$Node
   9:          1199          57552  java.util.HashMap
  10:           783          54312  [I
  11:           658          45208  [Ljava.util.HashMap$Node;
  12:          1285          41120  org.apache.zookeeper.server.DataNode
  13:           437          38456  java.lang.reflect.Method
  14:           502          36144  org.apache.zookeeper.server.Request
  15:           882          35280  java.util.TreeMap$Entry
  16:           501          24048  org.apache.zookeeper.txn.TxnHeader
  17:           889          21336  java.util.LinkedList$Node
  18:           582          21296  [Ljava.lang.String;
  19:          1049          16784  java.util.HashSet
  20:           501          16032  org.apache.zookeeper.server.quorum.QuorumPacket
  21:           399          15960  java.lang.ref.SoftReference
  22:            31          15952  [Ljava.util.concurrent.ConcurrentHashMap$Node;

 

打印類加載器統計信息(jmap -clstats pid)

jmap -clstats  8512
Attaching to process ID 8512, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
finding class loader instances ..done.
computing per loader stat ..done.
please wait.. computing liveness....................................liveness analysis may be inaccurate ...
class_loader    classes    bytes    parent_loader    alive?    type

<bootstrap>    1359    2420845      null      live    <internal>
0x000000008128cef8    1    1474      null      dead    sun/reflect/DelegatingClassLoader@0x0000000017289df8
0x000000008128d088    1    880      null      dead    sun/reflect/DelegatingClassLoader@0x0000000017289df8
0x000000008128d218    1    880      null      dead    sun/reflect/DelegatingClassLoader@0x0000000017289df8
0x00000000814621d0    0    0    0x000000008120b6c8    dead    java/util/ResourceBundle$RBClassLoader@0x0000000017303798
0x000000008120b6c8    358    716069    0x000000008120b728    live    sun/misc/Launcher$AppClassLoader@0x000000001728f6a0
0x000000008120b728    3    2574      null      live    sun/misc/Launcher$ExtClassLoader@0x000000001728fa48
0x000000008128cfc0    1    880      null      dead    sun/reflect/DelegatingClassLoader@0x0000000017289df8
0x000000008128d150    1    880      null      dead    sun/reflect/DelegatingClassLoader@0x0000000017289df8

total = 9    1725    3144482        N/A        alive=3, dead=6        N/A    

 

 把堆信息生成一個文件(jmap -dump:live,format=b,file=heap.bin <pid>)

[d:\]$ jmap -dump:live,format=b,file=heap.bin 8512
Dumping heap to D:\heap.bin ...
Heap dump file created

 

 之後,我們利用Mat來分析,下載 Eclipse Memory Analyzer

 

..

下載完解壓

...

..

..

..打開我們剛纔生成的文件

 

..

 ..看效果

..

JStat

每隔一段時間輸出GC情況(jstat -gcutil pid inteval)

[d:\]$ jstat -gcutil 8512 3000
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00   0.94   7.26  96.88  93.14      7    0.061     2    0.022    0.082
  0.00   0.00   0.94   7.26  96.88  93.14      7    0.061     2    0.022    0.082
  0.00   0.00   0.94   7.26  96.88  93.14      7    0.061     2    0.022    0.082
  0.00   0.00   0.94   7.26  96.88  93.14      7    0.061     2    0.022    0.082
  0.00   0.00   0.94   7.26  96.88  93.14      7    0.061     2    0.022    0.082
  0.00   0.00   0.94   7.26  96.88  93.14      7    0.061     2    0.022    0.082
  0.00   0.00   0.94   7.26  96.88  93.14      7    0.061     2    0.022    0.082
  0.00   0.00   0.94   7.26  96.88  93.14      7    0.061     2    0.022    0.082
  0.00   0.00   0.94   7.26  96.88  93.14      7    0.061     2    0.022    0.082
  0.00   0.00   0.94   7.26  96.88  93.14      7    0.061     2    0.022    0.082
  0.00   0.00   0.94   7.26  96.88  93.14      7    0.061     2    0.022    0.082
  0.00   0.00   0.94   7.26  96.88  93.14      7    0.061     2    0.022    0.082
  0.00   0.00   0.94   7.26  96.88  93.14      7    0.061     2    0.022    0.082
  0.00   0.00   0.94   7.26  96.88  93.14      7    0.061     2    0.022    0.082
  0.00   0.00   0.94   7.26  96.88  93.14      7    0.061     2    0.022    0.082
  0.00   0.00   0.94   7.26  96.88  93.14      7    0.061     2    0.022    0.082

參數:

S0        from區已使用容量的百分比 
S1        to區已使用容量的百分比 
E         伊甸區已使用容量的百分比 
O         老年代已使用容量的百分比 
M         元數據空間利用率
CCS       壓縮類空間利用率
YGC       從應用程序啓動到採樣時年輕代中gc次數
YGCT      從應用程序啓動到採樣時年輕代中gc所用時間(s)
FGC       從應用程序啓動到採樣時old代(全gc)gc次數
FGCT      從應用程序啓動到採樣時old代(全gc)gc所用時間(s)
GCT       從應用程序啓動到採樣時gc用的總時間(s)

還有另外一個方法,輸出的要全面一些

[d:\]$ jstat -gc 8512 3000
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
4096.0 3584.0  0.0    0.0   133120.0  1257.0   37376.0     2715.3   9600.0 9300.8 1152.0 1073.0      7    0.061   2      0.022    0.082
4096.0 3584.0  0.0    0.0   133120.0  1257.0   37376.0     2715.3   9600.0 9300.8 1152.0 1073.0      7    0.061   2      0.022    0.082
4096.0 3584.0  0.0    0.0   133120.0  1257.0   37376.0     2715.3   9600.0 9300.8 1152.0 1073.0      7    0.061   2      0.022    0.082
4096.0 3584.0  0.0    0.0   133120.0  1257.0   37376.0     2715.3   9600.0 9300.8 1152.0 1073.0      7    0.061   2      0.022    0.082

 參數:

S0C:   當前from區容量
S1C:   當前to區容量
S0U:   from區已使用的容量
S1U:   to區已使用的容量
EC:    當前伊甸區的容量
EU:    伊甸區已使用的容量
OC:    老年代的容量
OU:    老年代已使用的容量
MC:    元空間容量
MU:    元空間已使用容量
CCSC:   壓縮類空間容量
CCSU:   已使用的壓縮類空間
YGC:   年輕代gc次數
YGCT:   年輕代gc時間
FGC:   full gc 次數
FGCT:  Full gc時間
GCT:   總gc時間

 

 

 

 

 參考:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jstat.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章