简介

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

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

更多精彩内容且看:

更多内容请访问www.flydean.com

接下来进入我们的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,我们可以看到首页展示的是各个包中的类的实例和地址信息:

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

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

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

总结

本文介绍了jmap和jhat的使用。

本文作者:flydean程序那些事

本文链接:http://www.flydean.com/jdk14-jmap-jhat/

本文来源:flydean的博客

欢迎关注我的公众号:程序那些事,更多精彩等着您!

JDK14性能管理工具:jmap和jhat使用介绍的更多相关文章

  1. 应用性能管理工具PinPoint介绍

    概述: 下面介绍一个开源的 APM (Application Performance Management/应用性能管理)工具 - Pinpoint.一个分布式事务跟踪系统的平台,思路基于google ...

  2. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

    摘要: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat.hprof等小巧的工具,本博客希望 ...

  3. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解(转VIII)

    JVM本身就是一个java进程,一个java程序运行在一个jvm进程中.多个java程序同时运行就会有多个jvm进程.一个jvm进程有多个线程至少有一个gc线程和一个用户线程. JDK本身提供了很多方 ...

  4. JVM性能监控与故障处理命令汇总(jps、jstat、jinfo、jmap、jhat、jstack)

    给一个系统定位问题的时候,知识.经验是关键基础,数据是依据,工具才是运用知识处理数据的手段 使用适当的虚拟机监控和分析的工具可以加快我们分析数据.定位解决问题的速度,本文主要介绍了几款服 务器上常用的 ...

  5. 【转】JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解

    http://www.cnblogs.com/therunningfish/p/5524238.html JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsol ...

  6. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat, hprof使用详解

    JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat等小巧的工具,本博客希望能起抛砖引玉之用,让 ...

  7. JVM性能调优监控工具——jps、jstack、jmap、jhat、jstat、hprof使用详解

    摘要: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat.hprof等小巧的工具,本博客希望 ...

  8. 使用JDK自带的jmap和jhat监控处于运行状态的Java进程

    对于处于运行状态中的Java进程,JDK自带了很多工具,允许Java开发人员监控运行进程中的各种状态,比如该进程内部创建了多少个对象实例,消耗了多少内存,等等. 本文基于JDK1.8而写成. 我下面写 ...

  9. JVM 性能调优监控工具 jps、jstack、jmap、jhat、jstat、hprof 使用详解

    转自:  https://my.oschina.net/feichexia/blog/196575 摘要: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConso ...

  10. JDK的命令行工具系列 (三) jhat、jstack

    jhat: heapdump文件分析工具 在前两篇系列文章JDK的命令行工具系列 (一) jps.jstat.JDK的命令行工具系列 (二) javap.jinfo.jmap中, 我们已经介绍过了jp ...

随机推荐

  1. Singularity容器

    """参考文档 https://apptainer.org/user-docs/master/build_a_container.html ""&qu ...

  2. python字符串模板文本处理之Template

    from string import Template s = Template('$who 在 $do') ts = s.substitute(who="张三", do=&quo ...

  3. docker部署fastdfs并在Django中集成

    拉取Fastdfs镜像 docker pull delron/fastdfs 构建Tracker容器 是在Linux环境下,使用docker镜像构建tracker容器,用于启动跟踪服务器,起到调度的作 ...

  4. 【LeetCode二叉树#19】有序数组转换为二叉搜索树(构造二叉树)

    将有序数组转换为二叉搜索树 力扣题目链接(opens new window) 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个 ...

  5. 【Azure 环境】通过Python SDK收集所有订阅简略信息,例如订阅id 名称, 资源组及组内资源信息等,如何给Python应用赋予相应的权限才能获取到信息呢?

    问题描述 通过Python  SDK收集所有订阅简略信息,例如订阅id 名称, 资源组及组内资源信息等,如何给Python应用赋予相应的权限才能获取到信息呢?在一个企业的账号中,同一个组织有一个相同的 ...

  6. 【Azure 应用服务】可以在app service里建SFTP服务吗?

    问题描述 怎样可以在App Service里建SFTP服务? 并不是说通过FTP的方式进行App Service的文件部署. 问题回答 不能通过 App Service 来搭建总计的SFTP服务,因为 ...

  7. 如何使用 perf 分析 splice 中 pipe 的容量变化

    如何使用 perf 分析 splice 中 pipe 的容量变化 这个文章为了填上一篇文章的坑的,跟踪内核函数本来是准备使用 ebpf 的,但是涉及到了低内核版本,只能使用 kprobe 了. 恰好, ...

  8. java中StringBuffer与 StringBuilder 类

    目录 创建 StringBuffer 类 追加字符串 替换字符 反转字符串 删除字符串 StringBuffer 方法 在 Java 中,除了通过 String 类创建和处理字符串之外,还可以使用 S ...

  9. 2、mysql存储引擎

    存储引擎 1 存储引擎概述 和大多数的数据库不同, MySQL中有一个存储引擎的概念, 针对不同的存储需求可以选择最优的存储引擎. 存储引擎就是存储数据,建立索引,更新查询数据等等技术的实现方式 .存 ...

  10. java服务OOM和CPU飙升排查

    一.JVM参数 -D 可以是系统默认有的参数,也可以是自己定义的参数 -Dfile.encoding=UTF-8 -Dmaven.test.skip=true -Dspring.profiles.ac ...