JVM自帶了一些比較好用的工具,比如jstat,jmap等。
jstat -gc pid
可以查看某個進程的gc次數。每列的含義如下
字段 | 含義 |
---|---|
S0 | Heap上的 Survivor space 0 區已使用空間的百分比 |
S1 | Heap上的 Survivor space 1 區已使用空間的百分比 |
E | Heap上的 Eden space 區已使用空間的百分比 |
O | Heap上的 Old space 區已使用空間的百分比 |
P | Perm space 區已使用空間的百分比 |
YGC | 從應用程序啟動到采樣時發生 Young GC 的次數 |
YGCT | 從應用程序啟動到采樣時 Young GC 所用的時間(單位秒) |
FGC | 從應用程序啟動到采樣時發生 Full GC 的次數 |
FGCT | 從應用程序啟動到采樣時 Full GC 所用的時間(單位秒) |
GCT | 從應用程序啟動到采樣時用于垃圾回收的總時間(單位秒) |
jmap -heap pid
可以查看內存中各個代(新生代,老年代和永久代)的大小配置以及使用情況。比如
Attaching to process ID 31523, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.65-b04
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 2684354560 (2560.0MB)
NewSize = 1342177280 (1280.0MB)
MaxNewSize = 1342177280 (1280.0MB)
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 4
PermSize = 83886080 (80.0MB)
MaxPermSize = 167772160 (160.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 1118502912 (1066.6875MB)
used = 1071778952 (1022.128059387207MB)
free = 46723960 (44.55944061279297MB)
95.82263403172972% used
Eden Space:
capacity = 894828544 (853.375MB)
used = 894828544 (853.375MB)
free = 0 (0.0MB)
100.0% used
From Space:
capacity = 223674368 (213.3125MB)
used = 176950408 (168.75305938720703MB)
free = 46723960 (44.55944061279297MB)
79.11072224422246% used
To Space:
capacity = 223674368 (213.3125MB)
used = 0 (0.0MB)
free = 223674368 (213.3125MB)
0.0% used
concurrent mark-sweep generation:
capacity = 1342177280 (1280.0MB)
used = 1342177128 (1279.999855041504MB)
free = 152 (1.4495849609375E-4MB)
99.99998867511749% used
Perm Generation:
capacity = 83886080 (80.0MB)
used = 22813536 (21.756683349609375MB)
jmap -histo pid
統計內存中每個對象占用的大小。
還可以帶上參數live: jmap -histo:live pid,這樣就只統計當前依然存活的對象。
image.png
[ 表示是一個數組
C: char
B: byte
I: int
jmap -dump 配合eclipse的memory analyzer tool
jmap -dump:format=b,file=dump.hprof pid
這個命令可以把當前的內存dump到文件,然后通過eclipse的memory analyzer tool,可以分析這個dump,檢測可能的內存泄漏等。
如果dump文件過大,mat加載時候會報錯
An internal error occurred during:
"Parsing heap dump from **\java_pid6564.hprof'".Java heap space
可以把MemoryAnalyzer.ini里面的-Xmx1024m改為更大的數即可解決。