如何使用jmap?

                                           jmap的使用说明


文章目录

        一、jamp的作用

        二、语法及说明

        三、 举例说明


一、jamp的作用

        作用:监控内存内的Java对象

二、语法及说明

       语法:

               jmap [option]

       说明:

              option:命令选项,常用选项如下:

              -heap: 打印Java堆概要信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况;

              -histo[:live]: 打印Java堆中对象直方图,通过该图可以获取每个class的对象数目,占用内存大小和类全名信息,带上:live,则只                                      统计活着的对象 ;

              -permstat 打印永久代统计信息;

              -finalizerinfo 打印等待回收的对象信息

              -dump:hprof二进制格式将Java堆信息输出到文件内,该文件可以用MATVisualVMjhat等工具查看;

            dump-options选项:

                 live 只输出活着的对象;不指定,则输出堆中所有对象

                 format=b 指定输出格式为二进制

                file= 指定文件名及文件存储位置,例如:jmap -dump:live,format=b,file=D:\heap.bin

                -F -dump: -histo一起使用,当没有响应时,强制执行;注意:不支持live子选项

                pid:进程id

三、 举例说明

        step1:获得进程的id,在这里获得eclipse的pid,有两种方法:

        方法1:点击任务管理器——>详细信息就能看到eclipse进程的pid,如下图所示:

如何使用jmap?_第1张图片 

     方法2:点击Win+R,输入cmd,在该页面处输入jps,也能够得到Eclipse进程的pid,如下图所示:

如何使用jmap?_第2张图片

   step2:依次输入个表达式:

   ①-heap,在cmd中执行如下命令,将输出的结果导入到output.txt文件中,便于分析,如下图所示:

    输出结果:

Attaching to process ID 8124, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.131-b11

using thread-local object allocation.
Garbage-First (G1) GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 40 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(defalut 40)
   MaxHeapFreeRatio         = 70 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
   MaxHeapSize              = 1073741824 (1024.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
   NewSize                  = 1048576 (1.0MB) //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
   MaxNewSize               = 643825664 (614.0MB)//对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
   OldSize                  = 4194304 (4.0MB)//对应jvm启动参数-XX:OldSize=:设置JVM堆的‘老生代’的大小
   NewRatio                 = 2//对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
   SurvivorRatio            = 8//对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
   //从这里可以看出JDK8开始,永久代已经被元空间所取代
   MetaspaceSize            = 12582912 (12.0MB)对应jvm启动参数-XX:MetaspaceSize=:设置JVM堆的‘元空间’的初始大小
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 4294901760 (4095.9375MB)//对应jvm启动参数-XX:MaxMetaspaceSize= :设置JVM堆的‘元空间’的最大大小
   G1HeapRegionSize         = 1048576 (1.0MB)

Heap Usage://堆内存分布 
G1 Heap:
   regions  = 1024
   capacity = 1073741824 (1024.0MB)
   used     = 99890608 (95.26310729980469MB)
   free     = 973851216 (928.7368927001953MB)
   9.303037822246552% used
G1 Young Generation://新生代的内存分布
Eden Space://Eden区内存分布
   regions  = 9
   capacity = 142606336 (136.0MB) //Eden区总容量
   used     = 9437184 (9.0MB) //Eden区已使用
   free     = 133169152 (127.0MB) //Eden区剩余容量
   6.617647058823529% used used  //Eden区使用比率 
Survivor Space: //其中一个Survivor区的内存分布
   regions  = 14
   capacity = 14680064 (14.0MB)
   used     = 14680064 (14.0MB)
   free     = 0 (0.0MB)
   100.0% used
G1 Old Generation://老年代的内存分布
   regions  = 74
   capacity = 111149056 (106.0MB)
   used     = 75773360 (72.26310729980469MB)
   free     = 35375696 (33.73689270019531MB)
   68.1727427356648% used

60745 interned Strings occupying 5993360 bytes.

     ②-histo,在cmd中执行如下命令,将输出的结果导入到output.txt文件中,便于分析,如下图所示:

    输出部分结果如下:

    class name列出现了[C[B[L等很奇怪的内容,这些属于非自定义类,具体为:

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;

reference

an instance of class

S

short

signed short

Z

boolean

true or false

[

reference

one array dimension

             

             

             

                    

                    

                   

 

 

 

 

 

   -permstat 打印永久代统计信息:如下图所示,由于使用jdk是1.8,jdk1.8已经删除了永久代,取而代之的是新生代,因此无法无法得到永     久代的信息

   那又如何得到元空间里面的信息呢?,如下图所示

    jstat -gc  :Metaspace的信息会被打印出来,如下面的例子所示:

如何使用jmap?_第3张图片

  ③-finalizerinfo,在cmd中执行如下命令,将输出的结果导入到output.txt文件中,便于分析,如下图所示:

Attaching to process ID 8124, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.131-b11
Number of objects pending for finalization: 0 //说明当前F-QUEUE队列中并没有等待Fializer线程执行finalizer方法的对象

  ④-dump:,在cmd中执行如下命令,

  输出结果如下:

你可能感兴趣的:(JVM)