天天看點

jvm記憶體堆棧監控之jmap篇

jmap指令可以獲得運作中的jvm的堆的快照,進而可以離線分析堆,以檢查記憶體洩漏,檢查一些嚴重影響性能的大對象的建立,檢查系統中什麼對象最多,各種對象所占記憶體的大小等等

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

常用選項:

-dump:format=b,file=<filename> pid    # dump堆到檔案,format指定輸出格式,live指明是活着的對象,file指定檔案名
-finalizerinfo  # 列印等待回收對象的資訊
-heap           # 列印heap的概要資訊,GC使用的算法,heap的配置及wise heap的使用情況,可以用此來判斷記憶體目前的使用情況以及垃圾回收情況
-histo[:live]   # 列印堆的對象統計,包括對象數、記憶體大小等等 (因為在dump:live前會進行full gc,是以不加live的堆大小要大于加live堆的大小 )
-permstat       # 列印classload類裝載器和 jvm heap長久層的資訊. 包含包括每個裝載器的名字,活躍,位址,父裝載器,和其總共加載的類大小。另外,内部String的數量和占用記憶體數也會列印出來. 
-F              # 強制,強迫.在pid沒有相應的時候使用-dump或者-histo參數. 在這個模式下,live子參數無效.  
-J              # 傳遞參數給jmap啟動的jvm. ,如:-J-Xms256m           
Attaching to process ID 13614, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.55-b03
0x0000000000400000      7K      /aliyun/java-1.7.0/bin/java
0x0000003666400000      91K     /lib64/libgcc_s-4.4.7-20120601.so.1
0x0000003d7e400000      153K    /lib64/ld-2.12.so
0x0000003d7ec00000      1881K   /lib64/libc-2.12.so
0x0000003d7f000000      142K    /lib64/libpthread-2.12.so
0x0000003d7f400000      22K     /lib64/libdl-2.12.so
0x0000003d7f800000      46K     /lib64/librt-2.12.so
0x0000003d7fc00000      585K    /lib64/libm-2.12.so
0x0000003d80c00000      111K    /lib64/libresolv-2.12.so
0x0000003d82000000      461K    /lib64/libfreebl3.so
0x0000003d83000000      42K     /lib64/libcrypt-2.12.so
0x00007f42de29b000      257K    /aliyun/java-1.7.0/jre/lib/amd64/libjpeg.so
0x00007f42de4d6000      477K    /aliyun/java-1.7.0/jre/lib/amd64/libt2k.so
0x00007f42de755000      512K    /aliyun/java-1.7.0/jre/lib/amd64/libfontmanager.so
0x00007f42de9ce000      36K     /aliyun/java-1.7.0/jre/lib/amd64/headless/libmawt.so
0x00007f42debd5000      755K    /aliyun/java-1.7.0/jre/lib/amd64/libawt.so
0x00007f43047d4000      26K     /lib64/libnss_dns-2.12.so
0x00007f4304f2b000      250K    /aliyun/java-1.7.0/jre/lib/amd64/libsunec.so
0x00007f4305172000      774K    /aliyun/apr/lib/libapr-1.so.0.5.0
0x00007f43053a4000      658K    /usr/local/apr/lib/libtcnative-1.so.0.1.34
0x00007f43055bc000      44K     /aliyun/java-1.7.0/jre/lib/amd64/libmanagement.so
0x00007f4305ac4000      112K    /aliyun/java-1.7.0/jre/lib/amd64/libnet.so
0x00007f4305cdb000      89K     /aliyun/java-1.7.0/jre/lib/amd64/libnio.so
0x00007f432840d000      120K    /aliyun/java-1.7.0/jre/lib/amd64/libzip.so
0x00007f4328628000      64K     /lib64/libnss_files-2.12.so
0x00007f432883e000      214K    /aliyun/java-1.7.0/jre/lib/amd64/libjava.so
0x00007f4328a69000      63K     /aliyun/java-1.7.0/jre/lib/amd64/libverify.so
0x00007f4328cf8000      14786K  /aliyun/java-1.7.0/jre/lib/amd64/server/libjvm.so
0x00007f4329b61000      103K    /aliyun/java-1.7.0/lib/amd64/jli/libjli.so