java工具 jmap 命令的使用方法以及堆内存快照的创建及分析(1)

硅谷探秘者 1099 0 0

        jmapjava虚拟机自带的一种内存映像工具,我们可以通过该工具配合不同的参数来查看java虚拟机内存的详细信息(如程序中出现的所有对象的数量以及占用内存大小等),以及通过虚拟机内存的使用情况来定位以及分析程序中出现的问题。下面将详介绍该命令的使用。

命令格式:
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) 连接到远程调试服务
参数说明
  • 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服务

基本参数[option]说明与案例

一、-heap  参数

该参数将会打印堆内存(heap)的概要信息,GC使用的算法,heap的配置,内存使用情况等信息。

jmap -heap 24984

说明:24984 是程序的pid

C:\Users\LENOVO>jmap -heap 24984
Attaching to process ID 24984, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12

using thread-local object allocation.
Parallel GC with 4 thread(s) //GC 方式

Heap Configuration: //堆内存初始化配置
   MinHeapFreeRatio         = 0 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
   MaxHeapFreeRatio         = 100  //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
   MaxHeapSize              = 4267704320 (4070.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
   NewSize                  = 89128960 (85.0MB)  //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
   MaxNewSize               = 1422393344 (1356.5MB) //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
   OldSize                  = 179306496 (171.0MB) //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
   NewRatio                 = 2 //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
   SurvivorRatio            = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值 
   MetaspaceSize            = 21807104 (20.796875MB) // 元空间进行fgc的阈值
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB  //元空间的内存的实现就是本地内存,所以默认是本地内存的大小
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:  //堆内存使用情况
PS Young Generation
Eden Space:   //Eden区内存分布
   capacity = 136839168 (130.5MB)  //Eden区总容量
   used     = 89439976 (85.2966079711914MB) //Eden区已使用
   free     = 47399192 (45.203392028808594MB) //Eden区剩余容量
   65.36138541853748% used //Eden区使用比率
From Space:  //其中一个Survivor区的内存分布
   capacity = 17825792 (17.0MB)
   used     = 15765912 (15.035545349121094MB)
   free     = 2059880 (1.9644546508789062MB)
   88.44438440659466% used
To Space:   //另一个Survivor区的内存分布
   capacity = 19922944 (19.0MB)
   used     = 0 (0.0MB)
   free     = 19922944 (19.0MB)
   0.0% used
PS Old Generation  //当前的Old区内存分布
   capacity = 184025088 (175.5MB)
   used     = 21898568 (20.88410186767578MB)
   free     = 162126520 (154.61589813232422MB)
   11.899773143974803% used

26048 interned Strings occupying 3009800 bytes.
二、-histo[:live] 参数

        该参数将会 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.。

jmap -histo:live 24984
C:\Users\LENOVO>jmap -histo:live 24984

 num     #instances(实例数)  #bytes(字节大小)  class name(类名)                                                                          ----------------------------------------------
   1:         90973       43448952  [B
   2:        268286       32546840  [C
   3:         30631       11078832  [I
   4:        173127        4155048  java.lang.String
   5:         48189        2620928  [Ljava.lang.Object;
   6:         23291        2049608  java.lang.reflect.Method
   7:          9985        1109960  java.lang.Class
   8:         33297        1065504  java.util.concurrent.ConcurrentHashMap$Node
   9:         12709         901240  [Ljava.util.HashMap$Node;
  10:         27986         895552  java.util.HashMap$Node
  11:         21350         854000  java.util.LinkedHashMap$Entry
  12:         12383         693448  java.util.LinkedHashMap
  13:         26190         628560  java.lang.StringBuilder
  14:         25778         618672  java.util.ArrayList
...
..
.
三、-dump:[live],format=b,file=<filename> 参数

        该参数将会 使用hprof二进制的形式输出jvm的heap内容到指定文件,live子选项是可选的,假如指定live选项,那么只输出活的对象到文件。

jmap -dump:live,format=b,file=a.hprof 24984
C:\Users\LENOVO>jmap -dump:live,format=b,file=a.hprof 24984
Dumping heap to C:\Users\LENOVO\a.hprof ...
Heap dump file created

        这样堆内存快照就在指定的文件夹中创建完成了,可以使用其他工具(如 Eclipse Memory Analyzer)分析堆内存的具体细节。

四、-finalizerinfo参数

打印正等候回收的对象的信息

jmap -finalizerinfo 24984
C:\Users\LENOVO>jmap -finalizerinfo 24984
Attaching to process ID 24984, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
Number of objects pending for finalization: 0  //(等待回收的对象为0)
六、-clstats  参数

        该参数打印classload的信息。包含每个classloader的名字、活泼性、地址、父classloader和加载的class数量

jmap -clstats 24984
C:\Users\LENOVO>jmap -clstats 24984
Attaching to process ID 24984, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
finding class loader instances ..done.
computing per loader stat ..done.
please wait.. computing liveness.............................................................liveness analysis may be inaccurate ...
class_loader    classes bytes   parent_loader   alive?  type

<bootstrap>     2705    4589209   null          live    <internal>
0x00000006c2513350      1       880     0x00000006c1a14af0      dead    sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000006c3350130      1       880     0x00000006c1a14af0      dead    sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000006c2513e58      1       1472      null          dead    sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000006c3350838      1       880     0x00000006c1a14af0      dead    sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000006c3351d38      1       1473    0x00000006c1a14af0      dead    sun/reflect/DelegatingClassLoader@0x00000007c0009df8
0x00000006c3355838      1       1472    0x00000006c1a14af0      dead    sun/reflect/DelegatingClassLoader@0x00000007c0009df8
猜你喜欢
java基础 2981 描述Java执行线程模型:每个被执行时候,Java虚拟机都会同步一个栈帧[1](StackFrame)储局部变量表、操作数栈、动态连接、出口等信息。每一个被调
java虚拟机(jvm) 3935 jvm模型1)已经对模型进行了一个宏观概括http://www.jiajiajia.club/weblog/blog/artical/82那么下边一下执行过程还是一个
java基础 438 核心类ZipInputStreamapi文档请参考:https://nowjava.com/docs/java-api-11/java.base/java/util/zip
java虚拟机(jvm) 1634 这里HotSpot为例,且所说对象指普通Java对象,不包括数组和Class对象等。参考资料深入理解java虚拟机《周志明》1.对象布局HotSpot虚拟机中,对象在布局可
工具 967 java压缩zip类packagecom.dzqc.yx.util;importjava.io.File;importjava.io.FileInputStream
win rar 613 winrar压缩(windows)自从电脑被p2p垃圾软件恶意捆绑了一垃圾软件后,对这种软件有了后遗症。安装时候要小心。
反编译 973 java反编译(class、jar)jd-gui
java虚拟机(jvm) 2697 jvm模型(5)溢出1.模拟溢出代码packagetest;importjava.util.ArrayList;importjava.util.List
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7 2021年04月  4 2021年05月  4 2021年06月  1 2021年07月  7 2021年08月  2 2021年09月  8 2021年10月  9 2021年11月  16 2021年12月  14 2022年01月  7 2022年05月  1 2022年08月  3 2022年09月  2 2022年10月  2
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。