11.6.jmap使用详解
前面通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容。如:内存使用情况的汇总、对内存溢出的定位与分析。
1、查看内存使用情况
[root@myshop02 bin]# jmap -heap 3694
Attaching to process ID 3694, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.202-b08
##我这边用的是G1垃圾收集器
using thread-local object allocation.
Garbage-First (G1) GC with 1 thread(s)
Heap Configuration:#堆内存配置信息
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 1073741824 (1024.0MB)
NewSize = 1363144 (1.2999954223632812MB)
MaxNewSize = 643825664 (614.0MB)
OldSize = 5452592 (5.1999969482421875MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 1048576 (1.0MB)
Heap Usage:# 堆内存的使用情况
G1 Heap:#G1堆情况
regions = 1024
capacity = 1073741824 (1024.0MB)
used = 45869552 (43.74461364746094MB)
free = 1027872272 (980.2553863525391MB)
4.271934926509857% used
G1 Young Generation:#年轻代
Eden Space:
regions = 26
capacity = 79691776 (76.0MB)
used = 27262976 (26.0MB)
free = 52428800 (50.0MB)
34.21052631578947% used
Survivor Space:
regions = 4
capacity = 4194304 (4.0MB)
used = 4194304 (4.0MB)
free = 0 (0.0MB)
100.0% used
G1 Old Generation:##G1老年代
regions = 14
capacity = 50331648 (48.0MB)
used = 14412272 (13.744613647460938MB)
free = 35919376 (34.25538635253906MB)
28.63461176554362% used
16879 interned Strings occupying 1583944 bytes.
2、查看内存中对象数量及大小
#查看所有对象,包括活跃以及非活跃的
jmap ‐histo <pid> | more
#查看活跃对象
jmap ‐histo:live <pid> | more
[root@myshop02 bin]# jmap -histo:live 3694 | more
num #instances #bytes class name
----------------------------------------------
1: 31130 2898400 [C
2: 1402 802944 [B
3: 30895 741480 java.lang.String
4: 16607 531424 java.util.HashMap$Node
5: 3728 422344 java.lang.Class
6: 4621 406648 java.lang.reflect.Method
7: 7931 253792 java.util.concurrent.ConcurrentHashMap$Node
8: 4409 240128 [Ljava.lang.Object;
9: 1138 197296 [Ljava.util.HashMap$Node;
10: 1979 129448 [I
11: 112 107808 [Ljava.util.concurrent.ConcurrentHashMap$Node;
12: 1800 86400 java.util.HashMap
13: 5325 85200 java.lang.Object
14: 2608 55976 [Ljava.lang.Class;
15: 1292 51680 java.util.LinkedHashMap$Entry
16: 100 50304 [Ljava.util.WeakHashMap$Entry;
17: 1544 49408 java.util.Hashtable$Entry
#对象说明 B byte C char D double F float I int J long Z boolean [ 数组,如[I表示int[] [L+类名 其他对象
3、将内存使用情况dump到文件中
有些时候我们需要将jvm当前内存中的情况dump到文件中,然后对它进行分析,jmap也是支持dump到文件中的。
#用法:
jmap ‐dump:format=b,file=dumpFileName <pid>
#示例
jmap ‐dump:format=b,file=/root/dump.dat 3694
已经在/root下生成了dump.dat文件
4、jhat对dump文件进行分析
在上一小节中,我们将jvm的内存dump到文件中,这个文件是一个二进制的文件,不方便查看,这时我们可以借助于jhat工具进行查看。
#用法:
jhat ‐port <port> <file>
#示例:
[root@myshop02 ~]# jhat -port 9998 /root/dump.dat
Reading from /root/dump.dat...
Dump file created Mon Apr 06 15:10:56 CST 2020
Snapshot read, resolving...
Resolving 269315 objects...
Chasing references, expect 53 dots.....................................................
Eliminating duplicate references.....................................................
Snapshot resolved.
Started HTTP server on port 9998
Server is ready.
打开浏览器进行访问:http://192.168.0.108:9998
如果访问不了,需要防火墙开放9998端口。
[root@myshop02 ~]# firewall-cmd --zone=public --add-port=9998/tcp --permanent;
success
[root@myshop02 ~]# systemctl restart firewalld.service;
在最后面有OQL查询功能 。
点开之后可以执行OQL查询语句,如下,左侧是查询结果,字符串长度>=100的都查询出来了
Last updated
Was this helpful?