分析JAVA Application的內存使用時,jmap是一個很實用的輕量級工具。使用jmap能夠查看heap空間的概要狀況,粗略的掌握heap的使用狀況。也能夠生成heapdump文件,再使用jhat經過web瀏覽器具體分析內容中的對象和數據。html
jmap是JDK自帶的一個工具,很是小巧方便,其支持參數以下:java
-heap 打印heap空間的概要,這裏能夠粗略的檢驗heap空間的使用狀況。web
jmap -heap PID bootstrap
fs@inspur92:~/test/llxdata/081005/tmp$ jmap -heap 30774 Attaching to process ID 30774, please wait... Debugger attached successfully. Server compiler detected. JVM version is 20.1-b02 using thread-local object allocation. Parallel GC with 8 thread(s) Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 1073741824 (1024.0MB) NewSize = 1310720 (1.25MB) MaxNewSize = 17592186044415 MB OldSize = 5439488 (5.1875MB) NewRatio = 2 SurvivorRatio = 8 PermSize = 21757952 (20.75MB) MaxPermSize = 268435456 (256.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 353107968 (336.75MB) used = 9083624 (8.662818908691406MB) free = 344024344 (328.0871810913086MB) 2.572477775409475% used From Space: capacity = 2359296 (2.25MB) used = 0 (0.0MB) free = 2359296 (2.25MB) 0.0% used To Space: capacity = 2359296 (2.25MB) used = 0 (0.0MB) free = 2359296 (2.25MB) 0.0% used PS Old Generation capacity = 715849728 (682.6875MB) used = 47522208 (45.320709228515625MB) free = 668327520 (637.3667907714844MB) 6.638573172720407% used PS Perm Generation capacity = 40435712 (38.5625MB) used = 40067528 (38.21137237548828MB) free = 368184 (0.35112762451171875MB) 99.08945834810575% used
以上的輸出很簡單,第四行起開始輸出此進程的JAVA使用的環境。 瀏覽器
Heap Configuration:指java應用啓動時設置的JVM參數。像最大使用內存大小,年老代,年青代,持久代大小等。服務器
Heap Usage:當時的heap實際使用狀況。包括新生代、老生代和持久代。jvm
其中新生代包括:Eden區的大小、已使用大小、空閒大小及使用率。Survive區的From和To一樣。工具
有這個能夠很簡單的查看本進程的內存使用狀況。spa
能夠用於分析堆內存分區大小是否合理,新生代和老生代的大小分配是否合適等。code
也許進程佔用的總內存比較多,但咱們在這裏能夠看到真正用到的並無多少,不少都是"Free"。內存使用的堆積大多在老年代,內存池露始於此,因此要格外關心「Old Generation」。
jmap -histo PID
這裏會生成一個類的統計報表,此表很是簡單,如顯示什麼類有多少個實例,共佔了多少字節等。以下:
fs@inspur92:~/test/llxdata/081005/tmp$ jmap -histo 30774
num #instances #bytes class name ---------------------------------------------- 1: 12077 37306240 [I 2: 8404 8913528 [B 3: 55627 8311744 <constMethodKlass> 4: 55627 7576152 <methodKlass> 5: 35982 6771360 [C 6: 4838 5536240 <constantPoolKlass> 7: 88849 4696992 <symbolKlass> 8: 4838 3735856 <instanceKlassKlass> 9: 4024 3334976 <constantPoolCacheKlass> 10: 4600 2201648 <methodDataKlass> 11: 35011 1120352 java.lang.String 12: 5286 549744 java.lang.Class 13: 6509 441272 [S 14: 7454 392128 [[I
其中關於I、B、C等的說明以下 Table 4.2.
BaseType Character | Type | Interpretation |
B | byte | signed byte |
C | char | Unicode character |
D | double | double-precision floating-point value |
F | float | single-precision floating-point value |
I | int | integer |
J | long | long integer |
L<classname>; | reference | an instance of class de><classname>de> |
S | short | signed short |
Z | boolean | de>truede> or de>falsede> |
[ | reference | one array dimension |
jmap -permstat
打印一些持久代上的內存使用狀態,有「活」的,有「死」的。
class_loader classes bytes parent_loader alive? type <bootstrap> 2099 12780072 null live <internal> 0x00000000c069dc58 1 1968 0x00000000c017e968 dead sun/reflect/DelegatingClassLoader@0x00000000b00685b0 0x00000000c05c37d8 1 2008 0x00000000c017e968 dead sun/reflect/DelegatingClassLoader@0x00000000b00685b0 0x00000000c069d900 1 1968 0x00000000c017e968 dead sun/reflect/DelegatingClassLoader@0x00000000b00685b0
不經常使用。
-heap:format=b
產生一個HeapDump文件,此爲生成heapdump文件的重要參數。 例:jmap -heap:format=b 2657 會產生一個heap.bin的heapdump文件。 須要注意的是,今生成heapdump的參數爲JDK1.5,在1.6中的格式爲: jmap -dump:live,format=b,file=xxx 2657 這裏更增強大一些,能夠指定是存活的對象,還有生成heapdump的文件名。
當被測應用使用內容較大時(4G以上),dump須要花費較長時間,極可能致使dump失敗。
dump下來的文件結合jhat進行分析會更方便。
jhat
jhat是一個Java堆複製瀏覽器。這個工具分析Java堆複製文件(例如,由上面的"jmap -dump"所產生的)。Jhat啓動一個容許堆中的對象在web瀏覽器中進行分析的web服務器。這個工具並非想用於應用系統中而是用於"離線"分析。"jhat工具是平臺獨立的",其意思是,它能夠被用來觀察在任何平臺上所產生的堆複製。例如,咱們有可能在Linux系統上使用jhat來觀察一個 在Solaris OS上所產生的堆複製。
把本機的java內存映像導出到heap.dmp中,其中PID爲java進程的ID號。 jmap -dump:live,format=b,file=heap.dmp PID
導出後的映像文件能夠用jhat來進行分析,-J是向java虛擬機傳一個參數,如-mx768m是指定虛擬機可用最大的內存爲768M。若是映像文件很大,你要指定一個很大的值,不然在分析過程當中就會有OutOfMemeryError的錯誤。
jhat -J-mx768m -port <端口號:默認爲7000> heap.dmp
文章轉自:http://liulinxia02.blog.163.com/blog/static/26868772009111861834942/