分析java application的內存使用時,jmap是一個很實用的輕量級工具。使用jmap可以查看heap空間的概要情況,粗略的掌握heap的使用情況。也可以生成heapdump文件,再使用jhat通過web瀏覽器具體分析內容中的對象和數據。
jmap是JDK自帶的一個工具,非常小巧方便,其支持參數如下:
-heap 打印heap空間的概要,這里可以粗略的檢驗heap空間的使用情況。
jmap -heap PID
fs@inspur92:~/test/llxdata/081005/tmp$ jmap -heap 30774Attaching to PRocess ID 30774, please wait...Debugger attached successfully.Server compiler detected.JVM version is 20.1-b02using 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 GenerationEden Space: capacity = 353107968 (336.75MB) used = 9083624 (8.662818908691406MB) free = 344024344 (328.0871810913086MB) 2.572477775409475% usedFrom Space: capacity = 2359296 (2.25MB) used = 0 (0.0MB) free = 2359296 (2.25MB) 0.0% usedTo Space: capacity = 2359296 (2.25MB) used = 0 (0.0MB) free = 2359296 (2.25MB) 0.0% usedPS Old Generation capacity = 715849728 (682.6875MB) used = 47522208 (45.320709228515625MB) free = 668327520 (637.3667907714844MB) 6.638573172720407% usedPS 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實際使用情況。包括新生代、老生代和持久代。
其中新生代包括:Eden區的大小、已使用大小、空閑大小及使用率。Survive區的From和To同樣。
有這個可以很簡單的查看本進程的內存使用情況。
可以用于分析堆內存分區大小是否合理,新生代和老生代的大小分配是否合適等。
也許進程占用的總內存比較多,但我們在這里可以看到真正用到的并沒有多少,很多都是"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/
新聞熱點
疑難解答