打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。 可以输出所有内存中对象的工具,甚至可以将JVM 中的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位机上使用需要使用如下方式: [Java] 纯文本查看 复制代码 ​​?​

1

​jmap -J-d64 -heap pid​



用法摘要 [Java] 纯文本查看 复制代码 ?

1 2 3 4 5 6

​#指定进程号(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的整体堆信息 [Java] 纯文本查看 复制代码 ?

1

​jmap -heap PID​

说明如下: [Java] 纯文本查看 复制代码 ​​?​

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

​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”。


摘要统计 [Java] 纯文本查看 复制代码 ?

1

​jmap -histo PID​

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


导出 [Java] 纯文本查看 复制代码 ?

1

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

导出的内容自己需要借助图形工具来分析。 更多免费技术资料可关注:annalin1203