java經過jvm本身管理內存,同時Java提供了一些命令行工具,用於查看內存使用狀況。
這裏主要介紹一下jstat、jmap命令以及相關工具。java
jstat [Options] pid [interval] [count]算法
Options,通常使用 -gcutil 或 -gc 查看gc 狀況jvm
pid,當前運行的 java進程號
interval,間隔時間,單位爲秒或者毫秒
count,打印次數,若是缺省則打印無數次工具
Options 參數以下:spa
-gc:統計 jdk gc時 heap信息,以使用空間字節數表示命令行
-gcutil:統計 gc時, heap狀況,以使用空間的百分比表示debug
-class:統計 class loader行爲信息code
-compile:統計編譯行爲信息orm
-gccapacity:統計不一樣 generations(新生代,老年代,持久代)的 heap容量狀況server
-gccause:統計引發 gc的事件
-gcnew:統計 gc時,新生代的狀況
-gcnewcapacity:統計 gc時,新生代 heap容量
-gcold:統計 gc時,老年代的狀況
-gcoldcapacity:統計 gc時,老年代 heap容量
-gcpermcapacity:統計 gc時, permanent區 heap容量
$ jstat -gc 12538 5000
每5 秒一次顯示進程號爲 12538的 java進成的 GC狀況,結果以下圖:
結果說明
標誌 |
說明 |
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區已滿) |
TT |
持有次數限制 |
MTT |
最大持有次數限制 |
它是一個基於 rmi的應用,向遠程機器提供本機 jvm應用程序的信息。默認端口 1099。
$ jstatd -J-Djava.security.policy=my.policy
jmap 能夠從 core文件或進程中得到內存的具體匹配狀況,包括 Heap size, Perm size等等。
jmap [ option ] <pid> | <executable core> | <[server-id@]remote-hostname-or-IP>
pid:java進程 id
executable:產生 core dump的 java可執行程序
core:core dump文件
remote-hostname-or-IP:遠程 debug服務的主機名或 ip
server-id:遠程 debug服務的 id
-heap
打印heap的概要信息,GC 使用的算法,heap的配置及使用狀況 .
-histo[:live]
打印jvm heap 的直方圖。輸出類名、每一個類的實例數目、對象佔用大小。 VM的內部類名字開頭會加上前綴 」*」.
若是加上live 則只統計活的對象數量。
-dump:[live,]format=b,file=<filename>
使用hprof二進制形式,導出heap 內容到文件filename。
假如指定live 選項,那麼只輸出活的對象到文件 .
-finalizerinfo
打印正等候回收的對象的信息 .
-permstat
打印classload 和jvm heap 持久代的信息。
包含每一個classloader 的名字、是否存活、地址、父 classloade、加載的 class數量、內部 String的數量和佔用內存數。
-F
當pid沒有響應的時候,與-dump或者 -histo共同使用,強制生成 dump文件或 histo信息 . 在這個模式下 ,live子參數無效 .
-J
傳遞參數給啓動jmap 的jvm.
64位機上使用須要使用以下方式: jmap -J-d64 -heap pid
使用 jmap -heap pid ,能夠查看各個代的內存使用狀況。
$ jmap -heap 2083
能夠觀察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的內存使用狀況
jmap -dump:format=b,file=heapdump.hprof <pid>
導出heap dump到文件heapdump.hprof
jmap -histo 2083 | jmap -histo:live 2083
能夠觀察heap中全部對象的狀況(heap中全部生存的對象的狀況)。包括對象數量和所佔空間大小。