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 dump的java可執行程序)
core 將被打印信息的core dump文件
remote-hostname-or-IP 遠程debug服務的主機名或ip
server-id 唯一id,假如一台主機上多個遠程debug服務
2)、基本參數:
-dump:[live,]format=b,file=<filename> 使用hprof二進制形式,輸出jvm的heap內容到文件=. live子選項是可選的,假如指定live選項,那么只輸出活的對象到文件.
-finalizerinfo 打印正等候回收的對象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情況.
-histo[:live] 打印每個class的實例數目,內存占用,類全名信息. VM的內部類名字開頭會加上前綴”*”. 如果live子參數加上后,只統計活的對象數量.
-permstat 打印classload和jvm 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>