jmap,jhat分析內存

分析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/

相關文章
相關標籤/搜索