微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【JVM】jmap命令详解

【JVM】jmap命令详解

jmap命令详解原文

linux获取java进程PID

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

@H_404_12@ps -ef | grep java

Jmap —— 查看内存使用详情

1、jmap命令基本概述

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

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

@H_404_12@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 @R_841_4045@ion 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、命令格式

@H_404_12@> 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选项,那么只输出活的对象到文件.
@H_404_12@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 打印正等候回收的对象的信息.
@H_404_12@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堆内存的使用情况.
@H_404_12@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(类名)。它基本是按照使用使用大小逆序排列的

@H_404_12@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 @H_404_12@#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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐