打印出某个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
|
导出的内容自己需要借助图形工具来分析。