jmap一般使用于以下的几种情况:
内存泄漏,线上程序在运行一段时间之后内存越来越大,这是我们要使用jmap命令dump出,内存的对象信息,然后进行分析
内存使用大于预期,这个一般是程序设计不合理,有很多冗余的对象放置在内存中,可以使用jmap查看内存中的对象,看看有些对象是否必要
jvm调优,可以使用jmap查看整个堆的使用情况。根据新生代,老年代的大小和使用比利,来对各个区域进行设置。
参数
- jmap -heap pid
打印堆的摘要信息,包括GC算法,堆的配置信息和使用信息,如下:
[root@S10 ~]# jmap 23045
Attaching to process ID 23045, please wait...
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
[root@S10 ~]# jmap -heap 23045
Attaching to process ID 23045, please wait...
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
[root@S10 ~]# jmap -heap 11551
Attaching to process ID 11551, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.79-b02
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
MinHeapFreeRatio = 40 ##在堆的使用率小于40%的时候进行收缩,当Xmx=Xms的时候此配置无效
MaxHeapFreeRatio = 70 ##在堆使用率大于70%的时候进行扩展,当Xmx=Xms的时候此配置无效
MaxHeapSize = 2147483648 (2048.0MB) ##堆的最大空间
NewSize = 268435456 (256.0MB) ##新生代的大小
MaxNewSize = 268435456 (256.0MB) ##最大的新生代的大小
OldSize = 5439488 (5.1875MB) ##老年代的大小
NewRatio = 2 ##新生代中Eden和和Survivor区的比例为 8:1:1
SurvivorRatio = 8
PermSize = 134217728 (128.0MB) ##永久代的大小
MaxPermSize = 134217728 (128.0MB) ##永久代的最大内存
G1HeapRegionSize = 0 (0.0MB) ##使用G1垃圾收集的区间
Heap Usage:
New Generation (Eden + 1 Survivor Space): ##新生代的大小(Eden区加一个Survivor区的空间信息)
capacity = 241631232 (230.4375MB) ##总内存
used = 204444832 (194.97378540039062MB) ##已使用内存
free = 37186400 (35.463714599609375MB) ##剩余内存
84.61026759984405% used ## 使用内存占比
Eden Space:
capacity = 214827008 (204.875MB)
used = 204360880 (194.8937225341797MB)
free = 10466128 (9.981277465820312MB)
95.1281135005148% used
From Space:
capacity = 26804224 (25.5625MB)
used = 83952 (0.0800628662109375MB)
free = 26720272 (25.482437133789062MB)
0.3132043665953545% used
To Space:
capacity = 26804224 (25.5625MB)
used = 0 (0.0MB)
free = 26804224 (25.5625MB)
0.0% used
concurrent mark-sweep generation: ##CMS垃圾收集占用的空间信息
capacity = 1879048192 (1792.0MB)
used = 6216456 (5.928474426269531MB)
free = 1872831736 (1786.0715255737305MB)
0.3308300461087908% used
Perm Generation: ##永久代的空间信息
capacity = 134217728 (128.0MB)
used = 18828200 (17.955970764160156MB)
free = 115389528 (110.04402923583984MB)
14.028102159500122% used
7748 interned Strings occupying 611400 bytes.
- jmap -histo pid
按照类进行归纳,该命令会统计Java进程内每个类的对象个数之和,和该类所有对象的占用的空间之和,以及类名称。注意:
1 该命令在线上执行的时候要做好评估,否则会导致线上机器宕机。
2 jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息。
[root@S10 ~]# jmap -histo 14247 | more
num #instances #bytes class name
----------------------------------------------
1: 46252 6767776 <constMethodKlass>
2: 46252 5929280 <methodKlass>
3: 227 5511208 [I
4: 4244 4827320 <constantPoolKlass>
5: 4244 3042808 <instanceKlassKlass>
6: 3540 2726656 <constantPoolCacheKlass>
7: 24163 2246872 [C
8: 7768 1026128 [B
9: 23229 557496 java.lang.String
10: 792 460192 <methodDataKlass>
11: 4598 443696 java.lang.Class
12: 6059 363560 [S
13: 6947 362112 [[I
14: 3893 311440 java.lang.reflect.Method
15: 337 183328 <objArrayKlassKlass>
16: 5301 169632 java.util.HashMap$Entry
17: 5154 164928 java.util.concurrent.ConcurrentHashMap$HashEntry
18: 2839 134208 [Ljava.lang.Object;
19: 2886 115440 java.util.LinkedHashMap$Entry
20: 930 103496 [Ljava.util.HashMap$Entry;
21: 3216 102912 java.lang.ref.WeakReference
22: 1883 75320 java.lang.ref.SoftReference
23: 4353 69648 java.lang.Object
24: 1085 64080 [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;
25: 854 61488 java.lang.reflect.Field
26: 2711 58464 [Ljava.lang.Class;
27: 2137 51288 java.util.ArrayList
28: 1934 46416 java.beans.MethodRef
29: 1085 43400 java.util.concurrent.ConcurrentHashMap$Segment
30: 762 42672 java.beans.MethodDescriptor
31: 757 42392 java.util.LinkedHashMap
##############解释##############
instances : 对象个数
bytes : 占用字节
class name : 类
- jmap -dump
命令主要是用来dump Java进程的堆内容
执行下面这个命令会在当前目录生成test 文件(内存二进制文件)
[root@S10 ~]# jmap -F -dump:format=b,file=test 14247
执行如下的命令,分析dump出来二进制内存文件,并启动一个webserver。
jhat test
浏览器输入: http://172.16.0.10:7000/