A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小刀葛小伦 于 2019-9-12 16:29 编辑

打印出某个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] 纯文本查看 复制代码
jmap -J-d64 -heap pid

用法摘要
[Java] 纯文本查看 复制代码
#指定进程号(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] 纯文本查看 复制代码
jmap -heap PID
说明如下:
[Java] 纯文本查看 复制代码
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] 纯文本查看 复制代码
jmap -histo PID
生成一个类的统计报表,如什么类有多少个实例,共占了多少字节等。

导出
[Java] 纯文本查看 复制代码
jmap -dump:live,format=b,file=heap.bin PID
导出的内容自己需要借助图形工具来分析。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马