浅谈JDK14性能管理工具之jmap和jhat

 更新时间:2021年06月02日 11:07:43   作者:flydean  
我们在写代码的过程中,经常会遇到内存泄露的问题,比如某个集合中的对象没有被回收,或者内存出现不明原因的增长。这些都是需要我们来定位的问题,我们可以使用jmap和jhat来对java程序中的内存对象进行分析。

简介

jmap(Java Memory Map)是JDK自带的工具,用来将某个java程序的内存中的信息打印或者输出到文件中,然后通过jhat(Java Heap Analysis Tool)工具对输出的文件进行分析,从而找到可能出现的问题。

接下来进入我们的jmap和jhat之旅吧。

jmap

jmap -clstats <pid>

    to connect to running process and print class loader statistics

jmap -finalizerinfo <pid>

    to connect to running process and print information on objects awaiting finalization

jmap -histo[:[<histo-options>]] <pid>

    to connect to running process and print histogram of java object heap

jmap -dump:<dump-options> <pid>

    to connect to running process and dump java heap

jmap有下面四个可用选项:

clstats

clstats的全称叫做class loader statistics,用输出类加载有关的统计信息。

举一个例子:

jmap -clstats 8820

输出结果如下:

  • Index - class的编号
  • Super - 父类的编号
  • InstBytes - 每个instance的bytes大小
  • KlassBytes - 该class的bytes大小
  • annotations - 注解大小
  • CpAll - 每个class中constants, tags, cache, 和 operands的大小
  • MethodCount - class中方法的个数
  • Bytecodes - byte codes的大小
  • MethodAll - method, CONSTMETHOD, stack map, 和 method data的大小
  • ROAll - 可以放到read-only memory中的class元数据的大小
  • RWAll - 可以放到read/write memory中的class元数据大小
  • Total - ROAll + RWAll
  • ClassName - class name

finalizerinfo

finalizerinfo列出准备finalization的对象。

jmap -finalizerinfo 8820

如果没有对象等待被finalization,则会输出:

No instances waiting for finalization found

histo

histo用来输出java heap对象的直方图。可以加一个live选项,用来输出live的对象。

jmap -histo:live 8820

输出结果:

num是对象的编号,instances是对象的个数,bytes是对象的大小,class name是对象的class名字。

dump

最后要讲一下dump,dump用于dump整个java heap,dump可以接三个参数:

  • live - dump live对象
  • format=b - 以hprof的二进制模式dump
  • file=filename - dump对象到文件中

jmap -dump:live,file=dump.log 8820

这里dump.log文件是非常大的,用肉眼也很难分析,下面我们介绍一下jhat(Java Heap Analysis Tool)命令来对dump出来的对象进行分析。

jhat

注意,jhat从JDK9的时候已经删除了(JEP 241: Remove the jhat Tool)。现在Oracle官方推荐的分析工具是Eclipse Memory Analyzer Tool (MAT) 和 VisualVM。 这两款工具后面有时间再详细讲解。

今天先使用JDK8中的jhat来分析一下上面dump出来的文件。

先看下jhat的命令格式:

Usage:  jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>

-J<flag>          Pass <flag> directly to the runtime system. For

  example, -J-mx512m to use a maximum heap size of 512MB

-stack false:     Turn off tracking object allocation call stack.

-refs false:      Turn off tracking of references to objects

-port <port>:     Set the port for the HTTP server.  Defaults to 7000

-exclude <file>:  Specify a file that lists data members that should

  be excluded from the reachableFrom query.

-baseline <file>: Specify a baseline object dump.  Objects in

  both heap dumps with the same ID and same class will

  be marked as not being "new".

-debug <int>:     Set debug level.

    0:  No debug output

    1:  Debug hprof file parsing

    2:  Debug hprof file parsing, no server

因为这个命令已经被废弃了,这里就不过多讲解它的参数,总体来说jhap会解析dump出来的文件,并在本地启动一个web服务器,我们可以通过web页面来查看dump出来的数据。默认情况下web服务器的端口是7000。

jhat dump.log

Reading from dump.log...

Dump file created Mon May 11 21:13:43 CST 2020

Snapshot read, resolving...

Resolving 197989 objects...

Chasing references, expect 39 dots.......................................

Eliminating duplicate references.......................................

Snapshot resolved.

打开localhost:7000,我们可以看到首页展示的是各个包中的类的实例和地址信息:

点击首页的类的链接,可以跳转到类的具体信息页面:

类的信息页面包含很多信息,包括父类,类加载器,签名,安全域,子类,实例,引用等详细信息。

对我们分析内存泄露和内存异常等情况非常有用。

以上就是浅谈JDK14性能管理工具之jmap和jhat的详细内容,更多关于JDK14性能管理工具之jmap和jhat的资料请关注脚本之家其它相关文章!

相关文章

  • SpringCloud Zuul基本使用方法汇总

    SpringCloud Zuul基本使用方法汇总

    这篇文章主要介绍了SpringCloud Zuul基本使用方法汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • java HttpURLConnection 发送文件和字符串信息

    java HttpURLConnection 发送文件和字符串信息

    这篇文章主要介绍了java HttpURLConnection 发送文件和字符串信息的相关资料,需要的朋友可以参考下
    2017-06-06
  • 深入理解可视化JVM 故障处理工具

    深入理解可视化JVM 故障处理工具

    这篇文章主要介绍了深入理解可视化JVM 故障处理工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Java序列化原理详解

    Java序列化原理详解

    这篇文章主要介绍了Java序列化原理详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-06-06
  • SpringCloud配置中心Config过程解析

    SpringCloud配置中心Config过程解析

    这篇文章主要介绍了SpringCloud配置中心Config过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • web容器中实例化spring相关配置解析

    web容器中实例化spring相关配置解析

    这篇文章主要介绍了web容器中实例化spring相关配置解析,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java中使用websocket实现在线聊天功能

    Java中使用websocket实现在线聊天功能

    这篇文章主要介绍了Java中使用websocket实现在线聊天功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Java中异或的深入讲解

    Java中异或的深入讲解

    这篇文章主要给大家介绍了关于Java中异或的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • SpringBoot使用MockMvc进行单元测试的实例代码

    SpringBoot使用MockMvc进行单元测试的实例代码

    在Spring Boot应用程序中,使用MockMvc进行单元测试是一种有效的方式,可以验证控制器的行为和API的正确性,在这篇博客中,我们将介绍如何使用MockMvc对用户控制器进行测试,感兴趣的朋友可以参考下
    2024-01-01
  • 深入理解Java中的HashMap

    深入理解Java中的HashMap

    HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文将深入探讨HashMap的结构实现和功能原理
    2021-06-06

最新评论