jmap、jstat、jconsole、MemoryAnalyzer等工具檢視java記憶體情況
jmap (linux下特有,也是很常用的一個命令)
觀察執行中的jvm實體記憶體的佔用情況。
引數如下:
-heap :列印jvm heap的情況
-histo: 列印jvm heap的直方圖。其輸出資訊包括類名,物件數量,物件佔用大小。
-histo:live : 同上,但是隻答應存活物件的情況
-permstat: 列印permanent generation heap情況
命令使用:
jmap -heap 3409
可以觀察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的記憶體使用情況
輸出內容:
jmap -histo 3409 | jmap -histo:live 3409
可以觀察heap中所有物件的情況(heap中所有生存的物件的情況)。包括物件數量和所佔空間大小。
輸出內容:
寫個指令碼,可以很快把佔用heap最大的物件找出來,對付記憶體洩漏特別有效。
如果結果很多,可以用以下命令輸出到文字檔案。
jmap -histo 3409 | jmap -histo:live 3409 > a.txt
jinfo:可以輸出並修改執行時的java 程序的opts。
jps:與unix上的ps類似,用來顯示本地的java程序,可以檢視本地執行著幾個java程式,並顯示他們的程序號。
jstat:一個極強的監視VM記憶體工具。可以用來監視VM記憶體內的各種堆和非堆的大小及其記憶體使用量。
jmap:打印出某個java程序(使用pid)記憶體內的所有’物件’的情況(如:產生那些物件,及其數量)。
jconsole:一個java GUI監視工具,可以以圖表化的形式顯示各種資料。並可通過遠端連線監視遠端的伺服器VM。
詳細:在使用這些工具前,先用JPS命令獲取當前的每個JVM程序號,然後選擇要檢視的JVM。
jstat工具特別強大,有眾多的可選項,詳細檢視堆內各個部分的使用量,以及載入類的數量。使用時,需加上檢視程序的程序id,和所選引數。以下詳細介紹各個引數的意義。
jstat -class pid:顯示載入class的數量,及所佔空間等資訊。
jstat -compiler pid:顯示VM實時編譯的數量等資訊。
jstat -gc pid:可以顯示gc的資訊,檢視gc的次數,及時間。其中最後五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。
jstat -gccapacity:可以顯示,VM記憶體中三代(young,old,perm)物件的使用和佔用大小,如:PGCMN顯示的是最小perm的記憶體使用量,PGCMX顯示的是perm的記憶體最大使用量,PGC是當前新生成的perm記憶體佔用量,PC是但前perm記憶體佔用量。其他的可以根據這個類推, OC是old內純的佔用量。
jstat -gcnew pid:new物件的資訊。
jstat -gcnewcapacity pid:new物件的資訊及其佔用量。
jstat -gcold pid:old物件的資訊。
jstat -gcoldcapacity pid:old物件的資訊及其佔用量。
jstat -gcpermcapacity pid: perm物件的資訊及其佔用量。
jstat -util pid:統計gc資訊統計。
jstat -printcompilation pid:當前VM執行的資訊。
除了以上一個引數外,還可以同時加上 兩個數字,如:jstat -printcompilation 3024 250 6是每250毫秒列印一次,一共列印6次,還可以加上-h3每三行顯示一下標題。
jmap是一個可以輸出所有記憶體中物件的工具,甚至可以將VM 中的heap,以二進位制輸出成文字。
命令:jmap -dump:format=b,file=heap.bin
file:儲存路徑及檔名
pid:程序編號
?jmap -histo:live pid| less :堆中活動的物件以及大小
?jmap -heap pid : 檢視堆的使用狀況資訊
jinfo:的用處比較簡單,就是能輸出並修改執行時的java程序的執行引數。用法是jinfo -opt pid 如:檢視2788的MaxPerm大小可以用 jinfo -flag MaxPermSize 2788。
jconsole是一個用java寫的GUI程式,用來監控VM,並可監控遠端的VM,非常易用,而且功能非常強。使用方法:命令列裡打 jconsole,選則程序就可以了。
JConsole中關於記憶體分割槽的說明。
Eden Space (heap): 記憶體最初從這個執行緒池分配給大部分物件。
Survivor Space (heap):用於儲存在eden space記憶體池中經過垃圾回收後沒有被回收的物件。
Tenured Generation (heap):用於保持已經在 survivor space記憶體池中存在了一段時間的物件。
Permanent Generation (non-heap): 儲存虛擬機器自己的靜態(refective)資料,例如類(class)和方法(method)物件。Java虛擬機器共享這些類資料。這個區域被分割為只讀的和只寫的,
Code Cache (non-heap):HotSpot Java虛擬機器包括一個用於編譯和儲存原生代碼(native code)的記憶體,叫做“程式碼快取區”(code cache)
?jstack ( 檢視jvm執行緒執行狀態,是否有死鎖現象等等資訊) : jstack pid : thread dump
?jstat -gcutil pid 1000 100 : 1000ms統計一次gc情況統計100次;
另外推薦一款檢視jmap dump 的記憶體物件工具 MemoryAnalyzer
示例程式碼:
**jmap -heap 26552** Attaching to process ID 26552, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.111-b14 using thread-local object allocation. Parallel GC with 10 thread(s) Heap Configuration: MinHeapFreeRatio = 0 MaxHeapFreeRatio = 100 MaxHeapSize = 8589934592 (8192.0MB) NewSize = 2863136768 (2730.5MB) MaxNewSize = 2863136768 (2730.5MB) OldSize = 5726797824 (5461.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 = 2109210624 (2011.5MB) used = 894022640 (852.6064300537109MB) free = 1215187984 (1158.893569946289MB) 42.386598560960024% used From Space: capacity = 371720192 (354.5MB) used = 4601760 (4.388580322265625MB) free = 367118432 (350.1114196777344MB) 1.2379634195389633% used To Space: capacity = 360185856 (343.5MB) used = 0 (0.0MB) free = 360185856 (343.5MB) 0.0% used PS Old Generation capacity = 5726797824 (5461.5MB) used = 578519504 (551.7191925048828MB) free = 5148278320 (4909.780807495117MB) 10.101971848482703% used 47264 interned Strings occupying 5385736 bytes.