1. 程式人生 > >【JVM命令系列】jmap

【JVM命令系列】jmap

mark bsp null 參考 nfa location bootstra 內容 遠程debug

命令基本概述

Jmap是一個可以輸出所有內存中對象的工具,甚至可以將VM 中的heap,以二進制輸出成文本。打印出某個java進程(使用pid)內存內的,所有‘對象’的情況(如:產生那些對象,及其數量)。

使用方法 jmap -histo pid。如果使用SHELL ,可采用jmap -histo pid>a.log日誌將其保存到文件中,在一段時間後,使用文本對比工具,可以對比出GC回收了哪些對象。jmap -dump:format=b,file=outfile 3024可以將3024進程的內存heap輸出出來到outfile文件裏,再配合MAT(內存分析工具)。

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

jmap -J-d64 -heap pid

命令格式

l jmap [ option ] pid

l jmap [ option ] executable core

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

參數說明

1)、options:

l executable :產生core dump的java可執行程序;

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

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

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

2)、基本參數:

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

$jmap–dump:live,format=b,file=aaa.bin 3772

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

$jmap -finalizerinfo 3772

Attaching to process ID 3772, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 20.0-b11

Number of objects pending for finalization: 0 (等候回收的對象為0個)

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

$jmap –heap 3772

using parallel threads in the new generation.  ##新生代采用的是並行線程處理方式

using thread-local object allocation.   

Concurrent Mark-Sweep GC   ##同步並行垃圾回收

 

Heap Configuration:  ##堆配置情況

   MinHeapFreeRatio = 40 ##最小堆使用比例

   MaxHeapFreeRatio = 70 ##最大堆可用比例

   MaxHeapSize      = 2147483648 (2048.0MB) ##最大堆空間大小

   NewSize          = 268435456 (256.0MB) ##新生代分配大小

   MaxNewSize       = 268435456 (256.0MB) ##最大可新生代分配大小

   OldSize          = 5439488 (5.1875MB) ##老生代大小

   NewRatio         = 2  ##新生代比例

   SurvivorRatio    = 8 ##新生代與suvivor的比例

   PermSize         = 134217728 (128.0MB) ##perm區大小

   MaxPermSize      = 134217728 (128.0MB) ##最大可分配perm區大小

 

Heap Usage: ##堆使用情況

New Generation (Eden + 1 Survivor Space):  ##新生代(新生代 + survior space)          2 survior space 有一個保持空

   capacity = 241631232 (230.4375MB)  ##新生代容量

   used     = 77776272 (74.17323303222656MB) ##已經使用大小

   free     = 163854960 (156.26426696777344MB) ##剩余容量

   32.188004570534986% used ##使用比例

Eden Space:  ##伊甸區

   capacity = 214827008 (204.875MB) ##伊甸區容量

   used     = 74442288 (70.99369812011719MB) ##伊甸區使用

   free     = 140384720 (133.8813018798828MB) ##伊甸區當前剩余容量

   34.65220164496263% used ##伊甸區使用情況

From Space: ##survior1區

   capacity = 26804224 (25.5625MB) ##survior1區容量

   used     = 3333984 (3.179534912109375MB) ##surviror1區已使用情況

   free     = 23470240 (22.382965087890625MB) ##surviror1區剩余容量

   12.43827838477995% used ##survior1區使用比例

To Space: ##survior2 區

   capacity = 26804224 (25.5625MB) ##survior2區容量

   used     = 0 (0.0MB) ##survior2區已使用情況

   free     = 26804224 (25.5625MB) ##survior2區剩余容量

   0.0% used ## survior2區使用比例

concurrent mark-sweep generation: ##老生代使用情況

   capacity = 1879048192 (1792.0MB) ##老生代容量

   used     = 30847928 (29.41887664794922MB) ##老生代已使用容量

   free     = 1848200264 (1762.5811233520508MB) ##老生代剩余容量

   1.6416783843721663% used ##老生代使用比例

Perm Generation: ##perm區使用情況

   capacity = 134217728 (128.0MB) ##perm區容量

   used     = 47303016 (45.111671447753906MB) ##perm區已使用容量

   free     = 86914712 (82.8883285522461MB) ##perm區剩余容量

   35.24349331855774% used ##perm區使用比例


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

num     #instances         #bytes  class name

----------------------------------------------

   1:         65220        9755240  <constMethodKlass>

   2:         65220        8880384  <methodKlass>

   3:         11721        8252112  [B

   4:          6300        6784040  <constantPoolKlass>

   5:         75224        6218208  [C

   6:         93969        5163280  <symbolKlass>

   7:          6300        4854440  <instanceKlassKlass>

   8:          5482        4203152  <constantPoolCacheKlass>

   9:         72097        2307104  java.lang.String

  10:         15102        2289912  [I

  11:          4089        2227728  <methodDataKlass>

  12:         28887        1386576  org.apache.velocity.runtime.parser.Token

  13:          6792         706368  java.lang.Class

  14:          7445         638312  [Ljava.util.HashMap$Entry;

  15:          8770         607040  [S

  16:         17802         569664  java.lang.ref.WeakReference

  17:          9538         472688  [[I

  18:          8439         470440  [Ljava.lang.Object;

  19:          5168         454784  java.lang.reflect.Method

  20:         12559         401888  java.util.HashMap$Entry

  21:          3730         358080  org.apache.velocity.runtime.parser.node.ASTReference

  22:          4373         279872  org.apache.velocity.runtime.parser.node.ASTText

  23:           463         270392  <objArrayKlassKlass>

  24:          6695         267800  java.lang.ref.SoftReference

  25:          5198         249504  java.util.HashMap

  26:          2871         206712  org.apache.velocity.runtime.parser.node.ASTIdentifier

  27:          7526         180624  org.apache.velocity.util.introspection.Info

  28:          4441         177640  java.util.LinkedHashMap$Entry

  29:          5550         177600  java.util.concurrent.locks.ReentrantLock$NonfairSync

  30:          5723         175272  [Lorg.apache.velocity.runtime.parser.node.Node;

  31:          4473         156904  [Ljava.lang.String;

  32:          2773         155288  java.beans.MethodDescriptor

  33:          6264         150336  java.util.ArrayList

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

$jmap -permstat 3772


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

class_loader classes bytes parent_loader alive? type

<bootstrap> 2172 13144040 null live <internal>

0x00000007882d7ab8 0 0 0x0000000788106c00 dead [email protected]

0x0000000788c15ca8 1 3136 0x00000007880213d8 dead [email protected]

0x0000000788fb1718 1 1968 0x00000007880213d8 dead [email protected]

0x00000007882d0f08 1 2008 0x00000007880213d8 dead [email protected]

0x0000000788176c60 1 3112 0x00000007880213d8 dead [email protected]

0x0000000788a7e018 1 3144 0x00000007880213d8 dead [email protected]

0x0000000788f515d0 1 1984 0x00000007880213d8 dead [email protected]

0x000000078829a2c8 1 3112 0x00000007880213d8 dead [email protected]

0x0000000788fab478 1 3128 null dead [email protected]

0x0000000788030fd8 1 3112 0x00000007880213d8 dead [email protected]

0x0000000788d46048 1 3144 0x00000007880213d8 dead [email protected]

0x000000078816f6f0 1 3144 null dead [email protected]

0x0000000788c18850 1 3112 0x00000007880213d8 dead [email protected]

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

? -h | -help 打印輔助信息

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

參考文獻:

http://docs.oracle.com/javase/6/docs/technotes/tools/share/jmap.html

http://blog.csdn.net/fenglibing/article/details/6411953

原文地址:http://blog.csdn.net/zhaozheng7758/article/details/8623530

【JVM命令系列】jmap