【JVM】jmap命令详解

【JVM】jmap命令详解

jmap命令详解原文

linux获取java进程PID

查看当前运行的所有的java进程

ps -ef | grep java

Jmap —— 查看内存使用详情

1、jmap命令基本概述

jmap命令是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。

打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。

Usage:
    jmap [option] <pid>
        (to connect to running process)
    jmap [option] <executable <core>
        (to connect to a core file)
    jmap [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    <none>               to print same info as Solaris pmap
    -heap                to print java heap summary
    -histo[:live]        to print histogram of java object heap; if the "live"
                         suboption is specified, only count live objects
    -clstats             to print class loader statistics
    -finalizerinfo       to print information on objects awaiting finalization
    -dump:<dump-options> to dump java heap in hprof binary format
                         dump-options:
                           live         dump only live objects; if not specified,
                                        all objects in the heap are dumped.
                           format=b     binary format
                           file=<file>  dump heap to <file>
                         Example: jmap -dump:live,format=b,file=heap.bin <pid>
    -F                   force. Use with -dump:<dump-options> <pid> or -histo
                         to force a heap dump or histogram when <pid> does not
                         respond. The "live" suboption is not supported
                         in this mode.
    -h | -help           to print this help message
    -J<flag>             to pass <flag> directly to the runtime system

2、命令格式

>  jmap [option] <pid>:连接到正在运行的进程
        (to connect to running process)

>  jmap [option] <executable <core>:连接到核心文件
        (to connect to a core file)

>  jmap [option] [server_id@]<remote server IP or hostname>:连接到远程调试服务
        (to connect to remote debug server)

3.参数说明

1) 变量值:

  • pid: 目标进程的PID,进程编号,可以采用ps -ef | grep java 查看java进程的PID;
  • executable: 产生core dump的java可执行程序;
  • core: 将被打印信息的core dump文件;
  • remote-hostname-or-IP: 远程debug服务的主机名或ip;
  • server-id: 唯一id,假如一台主机上多个远程debug服务;

2)option:

  • <none>: 如果使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称。这与Solaris的pmap工具比较相似。
  • dump:[live,]format=b,file= 使用hprof二进制形式,输出jvm的heap内容到文件, live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.
jmap -dump:format=b,file=test.hprof 3772
jmap -dump:live,format=b,file=test.hprof 3772 ## 如果只dump heap中的存活对象,则加上选项-live

这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用。

  • -finalizerinfo 打印正等候回收的对象的信息.
jmap -finalizerinfo 15

结果:
Attaching to process ID 15, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.262-b10
Number of objects pending for finalization: 0 ##等候回收的对象为0个
  • -heap 打印heap的概要信息,GC使用的算法,heap的配置及JVM堆内存的使用情况.
jmap -heap 15

结果
Attaching to process ID 15, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.262-b10

using parallel threads in the new generation.  ##新生代采用的是并行线程处理方式
using thread-local object allocation.
Concurrent Mark-Sweep GC  ##同步并行垃圾回收

Heap Configuration:  ##堆配置情况,也就是JVM参数配置的结果[平常说的tomcat配置JVM参数,就是在配置这些]
   MinHeapFreeRatio         = 40  ##最小堆使用比例
   MaxHeapFreeRatio         = 70  ##最大堆可用比例
   MaxHeapSize              = 536870912 (512.0MB)  ##最大堆空间大小
   NewSize                  = 268435456 (256.0MB)  ##新生代分配大小
   MaxNewSize               = 268435456 (256.0MB)  ##最大可新生代分配大小
   OldSize                  = 268435456 (256.0MB)  ##老年代大小
   NewRatio                 = 2  ##新生代比例
   SurvivorRatio            = 8  ##新生代与suvivor的比例
   MetaspaceSize            = 21807104 (20.796875MB)  ##元空间大小 元空间本质跟永久代类似,元空间与永久代最大的区别在于:元空间并不在虚拟机中,而是使用本机内存,因此,元空间大小仅受本地内存限制
   CompressedClassSpaceSize = 1073741824 (1024.0MB)  
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:  ##堆使用情况【堆内存实际的使用情况】
New Generation (Eden + 1 Survivor Space):  ##新生代(伊甸区Eden区 + 幸存区survior(1+2)空间)
   capacity = 241631232 (230.4375MB)  ##伊甸区容量
   used     = 191127136 (182.27304077148438MB)  ##已经使用大小
   free     = 50504096 (48.164459228515625MB)  ##剩余容量
   79.09868869931516% used  ##使用比例
Eden Space:  ##伊甸区
   capacity = 214827008 (204.875MB)
   used     = 170204912 (162.32005310058594MB)
   free     = 44622096 (42.55494689941406MB)
   79.22882396611882% used
From Space:  ##survior1区
   capacity = 26804224 (25.5625MB)
   used     = 20922224 (19.952987670898438MB)
   free     = 5882000 (5.6095123291015625MB)
   78.05569749006723% used
To Space:  ##survior2 区
   capacity = 26804224 (25.5625MB)
   used     = 0 (0.0MB)
   free     = 26804224 (25.5625MB)
   0.0% used
concurrent mark-sweep generation:  ##老年代使用情况
   capacity = 268435456 (256.0MB)
   used     = 146936152 (140.12923431396484MB)
   free     = 121499304 (115.87076568603516MB)
   54.73798215389252% used

36399 interned Strings occupying 4146712 bytes.
  • -histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.

说明:instances(实例数)、bytes(大小)、classs name(类名)。它基本是按照使用使用大小逆序排列的

jmap -histo:live 15

 num     #instances         #bytes  class name
----------------------------------------------
   1:         11717       55996520  [Ljava.util.HashMap$Node;
   2:        142072       17500168  [C
   3:         20197       16779088  [B
   4:        141493        3395832  java.lang.String
   5:        104965        3358880  java.util.concurrent.ConcurrentHashMap$Node
   6:         50269        2495760  [Ljava.lang.Object;
   7:         51898        2491104  java.util.HashMap
   8:         20599        2270160  java.lang.Class
   9:         24224        2131712  java.lang.reflect.Method
  10:         12309        1717872  [I
  11:         52769        1266456  java.util.ArrayList
  12:         29598        1183920  java.util.LinkedHashMap$Entry
  13:           434         987264  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  14:         51193         819088  java.lang.Object
...
Total       1189759      129611872
#instance 是对象的实例个数 
#bytes 是总占用的字节数 
#class name 对应的就是 Class 文件里的 class 的标识 
B 代表 byte
C 代表 char
D 代表 double
F 代表 float
I 代表 int
J 代表 long
Z 代表 boolean
前边有 [ 代表数组, [I 就相当于 int[]
对象用 [L+ 类名表示

注意:

(1)jmap -histo命令 只知道某个class name占用了那么大的内存,但不知道由什么对象创建的。下一步需要将其他dump出来,使用内存分析工具进一步明确它是由谁引用的、由什么对象。

(2)jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息

  • -F 强迫.在pid没有响应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
  • -h | -help 打印辅助信息
  • -J 传递参数给jmap启动的jvm.
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值