文章目录

  • 简介
  • jmap
    • clstats
    • finalizerinfo
    • histo
    • dump
  • jhat
  • 总结

简介

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

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

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程

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

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

jmap

    jmap -clstats <pid>to connect to running process and print class loader statisticsjmap -finalizerinfo <pid>to connect to running process and print information on objects awaiting finalizationjmap -histo[:[<histo-options>]] <pid>to connect to running process and print histogram of java object heapjmap -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. Forexample, -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 shouldbe excluded from the reachableFrom query.-baseline <file>: Specify a baseline object dump.  Objects inboth heap dumps with the same ID and same class willbe marked as not being "new".-debug <int>:     Set debug level.0:  No debug output1:  Debug hprof file parsing2:  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. 深入理解java虚拟机(九)基础故障处理工具(jmap、jhat、jstack等)

    文章目录 前言 一.jps:虚拟机进程状况工具 二.jstat:虚拟机统计信息监视工具 三.jinfo: Java配置信息工具 四.jmap: Java内存映像工具 五.jhat:虚拟机堆转储快照分析 ...

  2. JDK14性能管理工具:Jconsole详解

    文章目录 简介 JConsole 概览 内存 线程 类 VM信息 MBean 总结 简介 我们在开发java项目的时候,或多或少都会去用到Java的性能管理工具.有时候是为了提升应用程序的性能,有时候 ...

  3. JDK14性能管理工具:jstat使用介绍

    文章目录 简介 JStat命令 JStat Output Options class compiler gc gccapacity gcnew gcnewcapacity gcold gcoldcap ...

  4. JDK14性能管理工具:jstack使用介绍

    文章目录 简介 jstack的命令格式 jstack的使用 总结 简介 在之前的文章中,我们介绍了JDK14中jstat工具的使用,本文我们再深入探讨一下jstack工具的使用. jstack工具主要 ...

  5. Java-Jvm-06-内存分析工具 jmap,jhat及dump分析

    1. 简介 jmap -heap [pid] 查看整个JVM内存状态 查看进程号为pid的Java程序的整个jvm内存状态 要注意的是在使用CMS GC 情况下,jmap -heap的执行有可能会导致 ...

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

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

  7. Java常用性能分析工具 jconsole、jvisualvm、 jstat、jinfo、jmap、jhat、jstack

    1.jconsole 2.jvisualvm 3.jstat 4.jinfo 5.jmap 6.jhat 7.jstack

  8. jvm性能调优实战 - 30使用jmap和jhat摸清线上系统的对象分布

    文章目录 Pre 使用jmap了解系统运行时的内存区域 jmap -heap PID 使用jmap了解系统运行时的对象分布 jmap -histo PID 使用jmap生成堆内存转储快照 使用jhat ...

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

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

最新文章

  1. 小米和西工大联手,三篇论文被Interspeech接收
  2. asp.net实现图片在线上传并在线裁剪
  3. 1027 Colors in Mars (20 分)_20行代码AC
  4. 业务专题篇:AB测试实验设计与评估
  5. java 获取键盘输入法_Java中接收键盘输入的三种方法
  6. DIV+CSS 让同一行的图片和文字对齐
  7. 【JDK源码分析】StringBuilder、StringBuilder、String、AbstractStringBuilder源码解析
  8. 企业数字化劳动力-Srise RPA产品
  9. hdu1695 GCD(莫比乌斯反演)
  10. python3速查参考- python基础 5 - 常用的文件操作
  11. webStrom 开始你的第一个React应用
  12. 华为推送服务(Push)
  13. MCE公司:更有效的新型小分子CDK9抑制剂
  14. 【笔记】Android桌面角标Badge官方文档和兼容性解决
  15. 模拟电子技术(二)基本放大电路
  16. c++初学基础小知识
  17. 计算机网络wifi是什么意思,Mifi是什么,和wifi有什么区别?
  18. 分享一个音乐API接口地址
  19. 当前系统代理不是安全代理,是否信任?
  20. python写xml文件 数据量特别大_python中大型xml文件的并行处理

热门文章

  1. 广义Fibonacci数列找循环节
  2. 省选考试防爆0注意事项(PART1考试习惯)
  3. 逆向工程核心原理学习笔记(五):实战“打补丁方法”修改字符串
  4. Windows下编译和安装Boost库
  5. cocos2d-x游戏开发(三)无限滚动地图
  6. C++ 虚函数与纯虚函数
  7. 最容易被盗的密码,你中了么?
  8. 【LiveVideoStack线上分享】— FreeSWITCH核心架构与流程控制
  9. C/C++学习之路_七: 内存管理
  10. LeetCode——树:BST