前言
我们在前面3年经验,没用过jstack?中学习了jstack相关使用介绍,这里再和大家一起学习下另外一个重要的命令。jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。常见参数如下
no option: 查看进程的内存映像信息,类似 Solaris pmap 命令。heap: 显示Java堆详细信息histo[:live]: 显示堆中对象的统计信息clstats:打印类加载器信息finalizerinfo: 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象dump: 下面直接进入主题 使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的起始地址、映射大小以及共享对象文件的路径全称。 打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息 显示堆中对象的统计信息,其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象。 生成堆转储快照dump文件。以hprof二进制格式转储Java堆到指定filename的文件中。live子选项是可选的。如果指定了live子选项,堆中只有活动的对象会被转储。堆快照是二进制文件,我们需要专门的分析工具,jprofiler,BM Heap Analyzer都可以很好的分析堆数据,这个命令执行的时候,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,会暂停应用, 所以线上系统慎用。之前在 记一次生产环境服务节点掉线排查中,服务的故障节点已经从Eureka下线,不影响用户使用,为了排查问题,所以运维在重启节点之前执行了dump。 format=b指定文件以二进制格式保存,file=heapdump.phrof指定快照存储文件位置。[root@t089089 study]# /usr/java/jdk1.8.0_111/bin/jmap 6324
Attaching to process ID 6324, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.111-b14
0x0000000000400000 7K /usr/java/jdk1.8.0_111/bin/java
0x0000003240c00000 91K /lib64/libgcc_s-4.4.7-20120601.so.1
0x0000003332e00000 1927K /usr/lib64/libcrypto.so.1.0.1e
0x0000003333200000 435K /usr/lib64/libssl.so.1.0.1e
0x0000003351e00000 153K /lib64/ld-2.12.so
0x0000003352200000 22K /lib64/libdl-2.12.so
0x0000003352600000 1881K /lib64/libc-2.12.so
0x0000003352a00000 142K /lib64/libpthread-2.12.so
0x0000003352e00000 46K /lib64/librt-2.12.so
0x0000003353200000 585K /lib64/libm-2.12.so
0x0000003353600000 88K /lib64/libz.so.1.2.3
0x0000003354600000 111K /lib64/libresolv-2.12.so
jmap -heap pid
/usr/java/jdk1.8.0_111/bin/jmap -heap 6324
Attaching to process ID 6324, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.111-b14
using thread-local object allocation.
Parallel GC with 2 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 1006632960 (960.0MB)
NewSize = 20971520 (20.0MB)
MaxNewSize = 335544320 (320.0MB)
OldSize = 41943040 (40.0MB)
NewRatio = 2
SurvivorRatio = 8
metaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxmetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 179306496 (171.0MB)
used = 79721312 (76.02816772460938MB)
free = 99585184 (94.97183227539062MB)
44.46091679801718% used
From Space:
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
To Space:
capacity = 13107200 (12.5MB)
used = 0 (0.0MB)
free = 13107200 (12.5MB)
0.0% used
PS Old Generation
capacity = 55574528 (53.0MB)
used = 15703056 (14.975601196289062MB)
free = 39871472 (38.02439880371094MB)
28.25585131375295% used
16698 interned Strings occupying 1521264 bytes.
jmap -histo:live pid
/usr/java/jdk1.8.0_111/bin/jmap -histo:live 6324| head -n 10
num #instances #bytes class name
----------------------------------------------
1: 35548 3532360 [C
2: 4423 1070328 [B
3: 8139 898536 java.lang.Class
4: 35463 851112 java.lang.String
5: 23879 764128 java.util.concurrent.ConcurrentHashMap$Node
6: 9527 542080 [Ljava.lang.Object;
7: 4549 436824 [I
jmap -dump:format=b,file=heapdump.phrof pid
/usr/java/jdk1.8.0_111/bin/jmap -dump:format=b,file=heapdump.phrof 6324
Dumping heap to /usr/server/study/heapdump.phrof ...
Heap dump file created



