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?