1. 程式人生 > >jmap、jstat、jconsole、MemoryAnalyzer等工具檢視java記憶體情況

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.