jdk分析工具:jmap和jhat


jmap

打印出某個java進程(使用pid)內存內的,所有對象的情況(如:產生那些對象,及其數量)。

可以輸出所有內存中對象的工具,甚至可以將VM 中的heap,以二進制輸出成文本。使用方法 jmap -histo pid。如果連用SHELL jmap -histo pid>a.log可以將其保存到文本中去,在一段時間后,使用文本對比工具,可以對比出GC回收了哪些對象。jmap -dump:format=b,file=outfile 3024可以將3024進程的內存heap輸出出來到outfile文件里,再配合MAT(內存分析工具(Memory Analysis Tool)或與jhat (Java Heap Analysis Tool)一起使用,能夠以圖像的形式直觀的展示當前內存是否有問題。

64位機上使用需要使用如下方式:

jmap -J-d64 -heap pid

命令格式

       jmap [ option ] pid

       jmap [ option ] executable core

       jmap [ option ] [server-id@]remote-hostname-or-IP

參數說明

1)、options 

executable Java executable from which the core dump was produced.

(可能是產生core dumpjava可執行程序)

core 將被打印信息的core dump文件

remote-hostname-or-IP 遠程debug服務的主機名或ip

server-id 唯一id,假如一台主機上多個遠程debug服務 

2)、基本參數:

-dump:[live,]format=b,file=<filename> 使用hprof二進制形式,輸出jvmheap內容到文件=. live子選項是可選的,假如指定live選項,那么只輸出活的對象到文件

-finalizerinfo 打印正等候回收的對象的信息.

-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情況.

-histo[:live] 打印每個class的實例數目,內存占用,類全名信息. VM的內部類名字開頭會加上前綴”*如果live子參數加上后,只統計活的對象數量

-permstat 打印classloadjvm heap長久層的信息包含每個classloader的名字,活潑性,地址,classloader和加載的class數量另外,內部String的數量和占用內存數也會打印出來

-F 強迫.pid沒有相應的時候使用-dump或者-histo參數在這個模式下,live子參數無效

-h | -help 打印輔助信息 

-J 傳遞參數給jmap啟動的jvm. 

pid 需要被打印配相信息的java進程id

 

使用示例

查詢jvm堆的概要信息

blue@blue-pc:~/apache-tomcat-7.0.39/conf$ jps -ml
2491 
9142 org.apache.catalina.startup.Bootstrap start
9168 sun.tools.jps.Jps -ml
2967 
root@blue
-pc:/home/blue/apache-tomcat-7.0.39/conf# jmap -heap 9142 Attaching to process ID 9142, please wait... Debugger attached successfully. Server compiler detected. JVM version is 20.10-b01 using thread-local object allocation. Parallel GC with 4 thread(s) Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 1031798784 (984.0MB) NewSize = 1048576 (1.0MB) MaxNewSize = 4294901760 (4095.9375MB) OldSize = 4194304 (4.0MB) NewRatio = 2 SurvivorRatio = 8 PermSize = 16777216 (16.0MB) MaxPermSize = 67108864 (64.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 16121856 (15.375MB) used = 15074368 (14.37603759765625MB) free = 1047488 (0.99896240234375MB) 93.50268356199187% used From Space: capacity = 2686976 (2.5625MB) used = 2684584 (2.5602188110351562MB) free = 2392 (0.00228118896484375MB) 99.91097799161585% used To Space: capacity = 2686976 (2.5625MB) used = 0 (0.0MB) free = 2686976 (2.5625MB) 0.0% used PS Old Generation capacity = 42991616 (41.0MB) used = 5071824 (4.8368682861328125MB) free = 37919792 (36.16313171386719MB) 11.797239722275153% used PS Perm Generation capacity = 16777216 (16.0MB) used = 11304456 (10.780769348144531MB) free = 5472760 (5.219230651855469MB) 67.37980842590332% used

 

dump jvm內存信息

root@blue-pc:/home/blue/apache-tomcat-7.0.39/conf# jmap -F -dump:format=b,file=tomcat.bin 9142
Attaching to process ID 9142, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.10-b01
Dumping heap to tomcat.bin ...
Finding object size using Printezis bits and skipping over...
Heap dump file created

 

jhat

用途:是用來分析java堆的命令,可以將堆中的對象以html的形式顯示出來,包括對象的數量,大小等等,並支持對象查詢語言

生成tomcat.bin dump文件后,使用jhat查看

root@blue-pc:/home/blue/apache-tomcat-7.0.39/conf# jhat tomcat.bin
.....
Started HTTP server on port 7000
Server is ready.

訪問 http://localhost:7000,就可以查看詳細的內存信息

有時你dump出來的堆很大,在啟動時會報堆空間不足的錯誤,可以使用如下參數:

jhat -J-Xmx512m <heap dump file>

更多參考 http://blog.csdn.net/gtuu0123/article/details/6039474


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM