jmap:可以從core檔案或程序中獲得記憶體的具體比對情況,包括Heap size, Perm size等等
-heap:列印jvm heap的情況
-histo:列印jvm heap的直方圖。其輸出資訊包括類名,對象數量,對象占用大小。
-histo: live :同上,但是隻答應存活對象的情況
-permstat:列印permanent generation heap情況
1. jmap -heap pid
檢視java 堆(heap)使用情況
using thread-local object allocation.
Parallel GC with 4 thread(s) //GC 方式 Heap Configuration: //堆記憶體初始化配置
MinHeapFreeRatio=40 //對應jvm啟動參數-XX:MinHeapFreeRatio設定JVM堆最小空閑比率(default 40)
MaxHeapFreeRatio=70 //對應jvm啟動參數 -XX:MaxHeapFreeRatio設定JVM堆最大空閑比率(default 70)
MaxHeapSize=512.0MB //對應jvm啟動參數-XX:MaxHeapSize=設定JVM堆的最大大小
NewSize = 1.0MB //對應jvm啟動參數-XX:NewSize=設定JVM堆的‘新生代’的預設大小
MaxNewSize =4095MB //對應jvm啟動參數-XX:MaxNewSize=設定JVM堆的‘新生代’的最大大小
OldSize = 4.0MB //對應jvm啟動參數-XX:OldSize=<value>:設定JVM堆的‘老生代’的大小
NewRatio = 8 //對應jvm啟動參數-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 //對應jvm啟動參數-XX:SurvivorRatio=設定年輕代中Eden區與Survivor區的大小比值
PermSize= 16.0MB //對應jvm啟動參數-XX:PermSize=<value>:設定JVM堆的‘永生代’的初始大小
MaxPermSize=64.0MB //對應jvm啟動參數-XX:MaxPermSize=<value>:設定JVM堆的‘永生代’的最大大小
Heap Usage: //堆記憶體分步
PS Young Generation
Eden Space: //Eden區記憶體分布
capacity = 20381696 (19.4375MB) //Eden區總容量
used = 20370032 (19.426376342773438MB) //Eden區已使用
free = 11664 (0.0111236572265625MB) //Eden區剩餘容量
99.94277218147106% used //Eden區使用比率
From Space: //其中一個Survivor區的記憶體分布
capacity = 8519680 (8.125MB)
used = 32768 (0.03125MB)
free = 8486912 (8.09375MB)
0.38461538461538464% used
To Space: //另一個Survivor區的記憶體分布
capacity = 9306112 (8.875MB)
used = 0 (0.0MB)
free = 9306112 (8.875MB)
0.0% used
PS Old Generation //目前的Old區記憶體分布
capacity = 366280704 (349.3125MB)
used = 322179848 (307.25464630126953MB)
free = 44100856 (42.05785369873047MB)
87.95982001825573% used
PS Perm Generation //目前的 “永生代” 記憶體分布
capacity = 32243712 (30.75MB)
used = 28918584 (27.57891082763672MB)
free = 3325128 (3.1710891723632812MB)
89.68751488662348% used
2. jmap -histo pid
檢視堆記憶體(histogram)中的對象數量,大小
num #instances #bytes class name
序号 執行個體個數 位元組數 類名
----------------------------------------------
1: 3174877 107858256 [C
2: 3171499 76115976 java.lang.String
3: 1397884 38122240 [B
4: 214690 37785440 com.tongli.book.form.Book
5: 107345 18892720 com.tongli.book.form.Book
6: 65645 13953440 [Ljava.lang.Object;
7: 59627 7648416 <constMethodKlass>
8: 291852 7004448 java.util.HashMap$Entry
9: 107349 6871176 [[B
..........
total 9150732 353969416
class name對應的就是Class檔案裡的class的辨別
B代表byte
C代表char
D代表double
F代表float
I代表int
J代表long
Z代表boolean
前邊 有[ 代表數組,[I 就相當于int[]
對象 用[L+類名表示
=======================================================================
jstack(linux下特有)
可以觀察到jvm中目前所有線程的運作情況和線程目前狀态
常用:jstack PID (檢視deadlock的情況)
jstat(jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]])
通常我們會在在下面指令後面加上 [<interval> [<count>]] 參數 例如jstat -gcutil 12849 1000 10 表示1000ms期間輸出10次gc統計資訊
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiInBnaucDM3IjM2EDNx8CXxEzMxAjMvwFduVWboNWY0RXYvwVbvNmLvR3YxUjLzM3Lc9CX6MHc0RHaiojIsJye.jpg)
1. jstat -gc pid
可以顯示gc的資訊,檢視gc的次數,及時間。
其中最後五項,分别是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。
2.jstat -gccapacity pid
可以顯示,VM記憶體中三代(young,old,perm)對象的使用和占用大小,
如:PGCMN顯示的是最小perm的記憶體使用量,PGCMX顯示的是perm的記憶體最大使用量,
PGC是目前新生成的perm記憶體占用量,PC是但前perm記憶體占用量。
其他的可以根據這個類推, OC是old内純的占用量。
3.jstat -gcutil pid(較常使用)
統計gc資訊統計。
4.jstat -gcnew pid
年輕代對象的資訊。
5.jstat -gcnewcapacity pid
年輕代對象的資訊及其占用量。
6.jstat -gcold pid
old代對象的資訊。
7.stat -gcoldcapacity pid
old代對象的資訊及其占用量。
8.jstat -gcpermcapacity pid
perm對象的資訊及其占用量。
9.jstat -class pid
顯示加載class的數量,及所占空間等資訊。
10.jstat -compiler pid
顯示VM實時編譯的數量等資訊。
11.stat -printcompilation pid
目前VM執行的資訊。
一些術語的中文解釋:
S0C:年輕代中第一個survivor(幸存區)的容量 (位元組)
S1C:年輕代中第二個survivor(幸存區)的容量 (位元組)
S0U:年輕代中第一個survivor(幸存區)目前已使用空間 (位元組)
S1U:年輕代中第二個survivor(幸存區)目前已使用空間 (位元組)
EC:年輕代中Eden(伊甸園)的容量 (位元組)
EU:年輕代中Eden(伊甸園)目前已使用空間 (位元組)
OC:Old代的容量 (位元組)
OU:Old代目前已使用空間 (位元組)
PC:Perm(持久代)的容量 (位元組)
PU:Perm(持久代)目前已使用空間 (位元組)
YGC:從應用程式啟動到采樣時年輕代中gc次數
YGCT:從應用程式啟動到采樣時年輕代中gc所用時間(s)
FGC:從應用程式啟動到采樣時old代(全gc)gc次數
FGCT:從應用程式啟動到采樣時old代(全gc)gc所用時間(s)
GCT:從應用程式啟動到采樣時gc用的總時間(s)
NGCMN:年輕代(young)中初始化(最小)的大小 (位元組)
NGCMX:年輕代(young)的最大容量 (位元組)
NGC:年輕代(young)中目前的容量 (位元組)
OGCMN:old代中初始化(最小)的大小 (位元組)
OGCMX:old代的最大容量 (位元組)
OGC:old代目前新生成的容量 (位元組)
PGCMN:perm代中初始化(最小)的大小 (位元組)
PGCMX:perm代的最大容量 (位元組)
PGC:perm代目前新生成的容量 (位元組)
S0:年輕代中第一個survivor(幸存區)已使用的占目前容量百分比
S1:年輕代中第二個survivor(幸存區)已使用的占目前容量百分比
E:年輕代中Eden(伊甸園)已使用的占目前容量百分比
O:old代已使用的占目前容量百分比
P:perm代已使用的占目前容量百分比
S0CMX:年輕代中第一個survivor(幸存區)的最大容量 (位元組)
S1CMX :年輕代中第二個survivor(幸存區)的最大容量 (位元組)
ECMX:年輕代中Eden(伊甸園)的最大容量 (位元組)
DSS:目前需要survivor(幸存區)的容量 (位元組)(Eden區已滿)