Java小强个人技术博客站点    手机版
当前位置: 首页 >> 理论 >> JDK工具-jmap命令

JDK工具-jmap命令

102240 理论 | 2015-8-1

打印出某个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


用法摘要

#指定进程号(pid)的进程
jmap [ option ] <pid>
#指定核心文件
jmap [ option ] <executable <core>
#指定远程调试服务器
jmap [ option ] [server-id@]<remote-hostname-or-IP>


参数

option

选项参数是互斥的(不可同时使用)。想要使用选项参数,直接跟在命令名称后即可。

pid

需要打印配置信息的进程ID。该进程必须是一个Java进程。想要获取运行的Java进程列表,你可以使用jps。

executable

产生核心dump的Java可执行文件。

core

需要打印配置信息的核心文件。

remote-hostname-or-IP

远程调试服务器的(请查看jsadebugd)主机名或IP地址。

server-id

可选的唯一id,如果相同的远程主机上运行了多台调试服务器,用此选项参数标识服务器。


选项

<no option>

如果使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称。这与Solaris的pmap工具比较相似。

-dump:[live,]format=b,file=<filename>

以hprof二进制格式转储Java堆到指定filename的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。想要浏览heap dump,你可以使用jhat(Java堆分析工具)读取生成的文件。

-finalizerinfo

打印等待终结的对象信息。

-heap

打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和generation wise heap usage。

-histo[:live]

打印堆的柱状图。其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个'*'前缀。如果指定了live子选项,则只计算活动的对象。

-permstat

打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。

-F

强制模式。如果指定的pid没有响应,请使用jmap -dump或jmap -histo选项。此模式下,不支持live子选项。

-h

打印帮助信息。

-help

打印帮助信息。

-J<flag>

指定传递给运行jmap的JVM的参数。


用法:

展示pid的整体堆信息

jmap -heap PID

说明如下:

Heap Configuration:#堆内存初始化配置
   MinHeapFreeRatio = 40  #-XX:MinHeapFreeRatio设置JVM堆最小空闲比率  
   MaxHeapFreeRatio = 70  #-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率  
   MaxHeapSize      = 268435456(256.0)#-XX:MaxHeapSize=设置JVM堆的最大大小  
   NewSize          = 1048576 (1.0MB) #-XX:NewSize=设置JVM堆的‘新生代’的默认大小  
   MaxNewSize       = 4294901760 (4095.9375MB) #-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小 
   OldSize          = 4194304 (4.0MB) #-XX:OldSize=设置JVM堆的‘老生代’的大小  
   NewRatio         = 2 #-XX:NewRatio=:‘新生代’和‘老生代’的大小比率  
   SurvivorRatio    = 8 #-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值  
   PermSize         = 12582912 (12.0MB) #-XX:PermSize=<value>:设置JVM堆的‘永生代’的初始大小  
   MaxPermSize      = 67108864 (64.0MB) #-XX:MaxPermSize=<value>:设置JVM堆的‘永生代’的最大大小
Heap Usage:  
PS Young Generation  
Eden Space:#Eden区内存分布  
   capacity = 71630848 (68.3125MB)
   used     = 4272376 (4.074455261230469MB)
   free     = 67358472 (64.23804473876953MB)
   5.964435881032708% used
From Space:#其中一个Survivor区的内存分布  
   capacity = 8912896 (8.5MB)
   used     = 0 (0.0MB)
   free     = 8912896 (8.5MB)
   0.0% used
To Space:#另一个Survivor区的内存分布  
   capacity = 8912896 (8.5MB)
       used     = 0 (0.0MB)
   free     = 8912896 (8.5MB)
   0.0% used
PS Perm Generation#当前的 “永生代” 内存分布  
   capacity = 59506688 (56.75MB)
   used     = 59312368 (56.56468200683594MB)
   free     = 194320 (0.1853179931640625MB)
   99.67344847019548% used

Heap Configuration,指在我们启动时设置的一些JVM参数。像最大使用内存大小,年老代,年青代,持久代大小等。有这个可以很简单的查看本进程的内存使用情况。也许进程占用的总内存比较多,但我们在这里可以看到真正用到的并没有多少,很多都是"Free"。内存使用的堆积大多在老年代,内存池露始于此,所以要格外关心“tenured generation”。


摘要统计

jmap -histo PID

生成一个类的统计报表,如什么类有多少个实例,共占了多少字节等。


导出

jmap -dump:live,format=b,file=heap.bin PID

导出的内容你需要借助图形工具来分析。


推荐您阅读更多有关于“ jdk jmap Heap Analysis ”的文章

上一篇:Java代码中获取运行时内存情况 下一篇:JDK工具-jrunscript命令

猜你喜欢

发表评论: