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

硅谷探秘者 890 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基础 2846 描述Java执行线程模型:每个被执行时候,Java虚拟机都会同步一个栈帧[1](StackFrame)储局部变量表、操作数栈、动态连接、出口等信息。每一个被调
java虚拟机(jvm) 3790 jvm模型1)已经对模型进行了一个宏观概括http://www.jiajiajia.club/weblog/blog/artical/82那么下边一下执行过程还是一个
java基础 281 核心类ZipInputStreamapi文档请参考:https://nowjava.com/docs/java-api-11/java.base/java/util/zip
java虚拟机(jvm) 1478 这里HotSpot为例,且所说对象指普通Java对象,不包括数组和Class对象等。参考资料深入理解java虚拟机《周志明》1.对象布局HotSpot虚拟机中,对象在布局可
工具 806 java压缩zip类packagecom.dzqc.yx.util;importjava.io.File;importjava.io.FileInputStream
win rar 507 winrar压缩(windows)自从电脑被p2p垃圾软件恶意捆绑了一垃圾软件后,对这种软件有了后遗症。安装时候要小心。
反编译 846 java反编译(class、jar)jd-gui
java虚拟机(jvm) 2532 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月  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio
目录
祝愿神州十三飞行乘组平安归来