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

简介

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的资料请关注我们其它相关文章!

(0)

相关推荐

  • Ubuntu安装jdk8常用方法流程解析

    安装方式: 1):通过ppa(源) 方式安装. 2):通过官网安装包安装.JDK官网下载地址 一:使用ppa(源)方式安装: 1):添加ppa源 sudo add-apt-repository ppa:webupd8team/java sudo apt-get update 2):安装oracle-java-installer(jdk8版本) sudo apt-get install oracle-java8-installer 注:安装器会提示是否同意条款,根据提示选择yes即可,若不想手动输

  • JDK源码Enum类原理及代码实例解析

    正文 一 概述 枚举类型是 JDK 5 之后引进的一种非常重要的引用类型,可以用来定义一系列枚举常量,使用 enum 来表示枚举可以更好地保证程序的类型安全和可读性 实际上在使用关键字enum创建枚举类型并编译后,编译器会为我们生成一个相关的类,这个类继承了Java API中的java.lang.Enum类, 也就是说通过关键字enum创建枚举类型在编译后事实上也是一个类类型而且该类继承自java.lang.Enum类 使用举例 public class EnumTest { enum MyCo

  • jdk15的安装与配置全过程记录

    如何下载并配置JDK 15 进入官网下载JDK 15. 官网地址:https://www.oracle.com/index.html 我们下载:https://www.jb51.net/softs/745289.html 1.点击Products然后点击java. 2.向下拉并找到 -Oracle JDK,点击进入. 3.点击下载JDK 15 我的电脑是win10,所以下载的win10的.推荐下载压缩版的.zip,好装也好卸载,也可以下载.exe直接下一步下一步,记得自己的安装路径就好. 点击下

  • Java jdk安装及javac命令无效解决方案

    一,我们安装java8,如下,我们可以选择安装地址,这个地址是我们用来配置环境变量的,唯一注意的是这个,其他的都是默认下一步.直至安装完成,jdk下载地址https://www.oracle.com/java/technologies/javase-downloads.html 二,我们配置环境变量 1>JAVA_HOME,值I:\JAVA\JDK(PS:这个是我自己切换的地址) 2>CLASSPATH, 值.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\to

  • java的jdk基础知识点总结

    在java开发中,有一个核心的组成部分,我们在进行java安装时,首先下载的就是这个软件,它就是JDK工具包.可以说在范围上是包括了java的其它组成部分,不过还需要我们对这个工具包的使用有深入的了解.下面我们就JDK的概念.组成部分.三种类型.与其他构件区别带来详解. 1.概念 JDK(Java Development Kit)是Java语言的软件开发工具包,主要用于移动设备.嵌入式设备上的Java应用程序.JDK是整个java开发的核心,它包含了JAVA的运行环境(JRE)和JAVA工具.没

  • 安装多个jdk导致eclipse打不开问题解决方案

    问题描述 本来使用的是jdk1.8,由于其他原因需要使用jdk1.6,在安装完jdk1.6后打开eclipse就会报错: Version 1.6.0_43 of the JVM is not suitable for this product.Version:1.7 or greater is required. 问题原因:jdk1.6安装完成时,会将java.exe.javaw.exe.javaws.exe放入环境变量Path的对应的某个目录中(win10是在C:\Windows\system

  • appium+python自动化配置(adk、jdk、node.js)

    1.环境配置 1.1node.js https://nodejs.org/zh-cn/ 安装提示下载安装 命令行下输入 node -v 查看是否安装成功,如图所示,则安装成功 1.2sdk 1.2.1安装sdk 下载地址: www.androiddevtools.cn/ 一路点下去,最后点finish. 完成后会自动弹出以下页面 如果没弹出上边的页面,则找到安装路径,打开下图所示的文件,即可弹出上边的页面 勾选图示的文件 安装,接受协议(Accept License). 1.2.2配置环境变量

  • 详解关于eclipse中使用jdk15对应javafx15的配置问题总结

    一.前言 废话: /*这两天一直卡在eclipse的jdk15对应的 java15的配置上,一直用不了.上了很多博客, 基本上都没有真正解决我的问题. 主要是下面几个异常:*/ //1.初始化异常:Error occurred during initialization of boot layer java.nio.file.InvalidPathException: Illegal char <:> at index 2: "D:\javafx\javafx-sdk-15.0.1\

  • Docker 解决openjdk容器里无法使用JDK的jmap等命令问题

    零.问题描述 项目:Java Spring Boot 项目 Docker 环境:Docker Toolbox.不是 Windows10,用不了 Docker for Windows 只能用这个. 使用 Docker Compose 编排服务,并启动 Mysql 和 Spring Boot 项目. docker-compose.yml 文件内容: version: '2' services: mysql: build: ./docker/builds/mysql ports: - "3386:33

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

    简介 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 -finali

  • JDK14性能管理工具之jstack使用介绍

    在之前的文章中,我们介绍了JDK14中jstat工具的使用,本文我们再深入探讨一下jstack工具的使用. jstack工具主要用来打印java堆栈信息,主要是java的class名字,方法名,字节码索引,行数等信息. jstack的命令格式 Usage: jstack [-l][-e] <pid> (to connect to running process) Options: -l long listing. Prints additional information about lock

  • 浅谈webpack构建工具配置和常用插件总结

    webpack构建工具已经火了好几年,也是当下狠火狠方便的构建工具,我们没有理由不去学习.既然选择webpack就要跟着时代走,我们要追随大牛的步伐,大牛等等我. 一.webpack基础 在根目录使用npm init 命令创建package.json,创建过程中一路回车. 本地安装webpack命令:npm install webpack webpack-cli --save-dev 安装成功后写入package.js的devDependencies中,可以通过 npm node_modules

  • JDK14性能管理工具之Jconsole的使用详解

    我们在开发java项目的时候,或多或少都会去用到Java的性能管理工具.有时候是为了提升应用程序的性能,有时候是为了查找java应用程序的bug. 性能监控和调试工具在英文中叫做profile tool,提起这种工具大家可能会想到一些非常出名的jprofile等收费工具,其实JDK也自带了一些性能调试工具,比如JMC和Jconsole. JMC现在已经和JDK的版本独立出来了,详情请参考我之前的文章: JDK 14的新特性:JFR,JMC和JFR事件流 ,今天我们将会重点讲解Jconsole的使

  • 浅谈c++性能测试工具之计算时间复杂度

    google benchmark已经为我们提供了类似的功能,而且使用相当简单. 具体的解释在后面,我们先来看几个例子,我们人为制造几个时间复杂度分别为O(n), O(logn), O(n^n)的测试用例: // 这里都是为了演示而写成的代码,没有什么实际意义 static void bench_N(benchmark::State& state) { int n = 0; for ([[maybe_unused]] auto _ : state) { for (int i = 0; i <

  • 浅谈c++性能测试工具google benchmark

    一.测试对象 这次测试的对象是标准库的vector,我们将会在vs2019 16.10和Linux + GCC 11.1上进行测试.为了代码写着方便,我还会启用c++17支持. 这次的疑问来自于<A Tour of C++>这本书,最近在重新翻阅本书的时候发现书里第九章给出了一个很有意思的建议:尽量少用reserve方法. 我们都知道reserve会提前分配足够大的内存来容纳元素,这样在push_back时可以减少内存分配和元素移动的次数,从而提高性能.所以习惯上如果我们知道vector中存储

  • 浅谈Xcode 开发工具 XCActionBar

    XCActionBar 是一个用于 Xcoded 的通用生产工具. 下载地址:https://github.com/pdcgomes/XCActionBar 基本命令: (1)「command+shift+8」或者双击「command」键可以打开「动作输入框窗口」 (2)「command+option+7」或者双击「alt」键可以执行「上次的动作」 编程时可用于双击或三击事件的按键分别为如下5个: (1)「alt」:NSAlternateKeyMask (2)「command」:NSComman

  • 浅谈常用字符串与集合类转换的工具类

    在项目中,我们经常需要把接收到的字符串转换成对应的集合类保存,或者把集合类转换成字符串以方便传输,这个工具类中封装了几个常用的方法,对于这种转换需求十分方便. import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Properties; import java.u

  • 浅谈python中的数字类型与处理工具

    python中的数字类型工具 python中为更高级的工作提供很多高级数字编程支持和对象,其中数字类型的完整工具包括: 1.整数与浮点型, 2.复数, 3.固定精度十进制数, 4.有理分数, 5.集合, 6.布尔类型 7.无穷的整数精度 8.各种数字内置函数及模块. 基本数字类型 python中提供了两种基本类型:整数(正整数金额负整数)和浮点数(注:带有小数部分的数字),其中python中我们可以使用多种进制的整数.并且整数可以用有无穷精度. 整数的表现形式以十进制数字字符串写法出现,浮点数带

  • 浅谈Android Studio 3.0 工具新特性的使用 Android Profiler 、Device File Explorer

    前言: 其实 studio3.0的工具大家也已经使用过一段时间了,自己呢,就是从bate版开始使用的,我觉得比较好用的几个地方.就几个,可能还没用到其他的精髓. 但我觉的这个两个功能对我是比较实用的.好那么下面就给大家介绍一下吧. 正文: 话不多说咱们直接上图吧.(个人比较喜欢看图说话) 第一个(Android Profiler)我要介绍的就是这个了.(先看一下效果"震撼一下") (图-1) (图-2) (图-3) (厉害不厉害,牛逼不牛逼)那么我们怎么来操作这个工具呢,来咱们接着看图

随机推荐