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

2019
0 59

        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
留言(0)
加载更多
猜你喜欢
  • blog git常笔记

    原文链接:https://blog.csdn.net/web_csdn_share/article/details/79243308 几个专名词译名如下 Workspace:作区 Index / Stage:暂区 R
  • blog java解压zip

    package unzip;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;
  • blog springboot项目中获取spring ioc容器管理对象

    一个类即可package com.dzqc.yx.util;import org.springframework.beans.BeansException;import org.springframework.context.Appli
  • blog java计算百

    public static void main(String[] args) { int a=3; int b=9; NumberFormat numberFormat = NumberFormat.getIn
  • file luyten反编译

    <h2 style="text-align: center;">luyten反编译</h2> <p><img src="http://www.jiajiajia.club:8089/weblog/
  • blog java base64转图片

    类package com.dzqc.yx.util;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;im
  • blog java webservice 接口

    1.pom文件<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>4.5.13</version><
  • blog java web图片验证码

    java web图片验证码1.验证码: 防止恶意破解密码、刷票、论坛灌水、刷页。 有效防止某个黑客对某一个特定注册特定程序暴力破解式进行不断登录尝试,实际上使验证码是现在很多网站通行式(比如
  • blog java压缩zip

    java压缩zip类package com.dzqc.yx.util;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;
  • blog 全文检索笔记

    全文检索流程图索引库中是如何?数据库一行数据会储为一个document对象,一条记录一列会储为一个field,不会将数据库所有数据都储到索引库。索引是如何过程流程图1. 文档,通过词组件进行词,获得词元(t