打印出某个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] 纯文本查看 复制代码 ?
说明如下: [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] 纯文本查看 复制代码 ?
生成一个类的统计报表,如什么类有多少个实例,共占了多少字节等。
导出 [Java] 纯文本查看 复制代码 ?
1 | jmap -dump:live,format=b,file=heap.bin PID |
导出的内容自己需要借助图形工具来分析。 更多免费技术资料可关注:annalin1203