jhat(Java Heap Analysis Tool),是一个用来分析java的堆情况的命令。是java虚拟机自带的一种虚拟机堆转储快照分析工具。

可以用jhat命令将dump出来的hprof文件转成html的形式,然后通过http访问可以查看堆情况。OK,现在来看看要怎么做吧!

首先要一段会抛出OOM异常的代码。

public class HeapOOM {

static class OOMObject{

}

public static void main(String[] args){

List list = new ArrayList<>();

while(true){

list.add(new OOMObject());

}

}

编译之后执行时加上参数:

-Xms20M -Xmx20M -Xmn10M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="hprof文件保存路径"

openjdk@ubuntu:~$ java -Xms20M -Xmx20M -Xmn10M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/openjdk/HeapDump/ -cp /home/openjdk/NetBeansProjects/JavaApplication1/build/classes test_HeapOOM.HeapOOM

java.lang.OutOfMemoryError: Java heap space

Dumping heap to /home/openjdk/HeapDump/java_pid5239.hprof ...

Heap dump file created [27583435 bytes in 4.678 secs]

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

at java.util.Arrays.copyOf(Arrays.java:2245)

at java.util.Arrays.copyOf(Arrays.java:2219)

at java.util.ArrayList.grow(ArrayList.java:242)

at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:216)

at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:208)

at java.util.ArrayList.add(ArrayList.java:440)

at test_HeapOOM.HeapOOM.main(HeapOOM.java:24)

黑体字部分是我运行时的指令:

-Xms20M:设置JVM初始内存的大小

-Xmx20M:设置JVM最大内存

-Xmn10M:设置JVM年轻代大小

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath="hprof文件保存路径":这是让堆OOM时dump出hprof文件和文件路径

这里把内存设置得很小是为了让内存尽快溢出,然后抛出异常。

可以看到文件输出为 /home/openjdk/HeapDump/java_pid5239.hprof

现在我们有了需要展示的东西,就可以请出我们的jhat了,如下:

openjdk@ubuntu:~$ jhat /home/openjdk/HeapDump/java_pid5239.hprof

Reading from /home/openjdk/HeapDump/java_pid5239.hprof...

Dump file created Fri Jan 25 20:53:37 CST 2019

Snapshot read, resolving...

Resolving 814957 objects...

Chasing references, expect 162 dots..................................................................................................................................................................

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

Snapshot resolved.

Started HTTP server on port 7000

Server is ready.

这样就启动起来了一个简易的HTTP服务,端口号是7000,尝试一下用浏览器访问一下它,本地的可以通过http://localhost:7000,就可以得到这样的页面:

@All classes.png

Other Queries 查询信息的方式

All classes including platform 把所有类信息显示出来(默认是不包括Java平台的类)

另外的查看堆异常主要关注两个:

Show instance counts for all classes (excluding platform) 平台外的所有对象信息

Show heap histogram 先是堆的统计信息

Show instance counts for all classes (excluding platform) .png

Show heap histogram.png

通过图我们可以看到创建了810326个 test_HeapOOM.HeapOOM$OOMObject 的实例,再回顾一下我们的代码,不正是在main函数里边不停的创建OOMObject对象导致的内存溢出吗?通过jhat我们可以很快定位到内存溢出问题的所在。

除了使用-XX:+HeapDumpOnOutOfMemoryError,还可以

1. 使用 jconsole 选项通过 HotSpotDiagnosticMXBean 从运行时获得堆转储(生成hprof文件)

2. 使用jmap

3. 使用 hprof 命令

java jhat_JVM学习笔记——jhat的使用相关推荐

  1. Java NIO 学习笔记(三)----Selector

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  2. 可能是最全面的 Java G1学习笔记

    转载自 可能是最全面的 Java G1学习笔记 引子 最近遇到很多朋友过来咨询G1调优的问题,我自己去年有专门学过一次G1,但是当时只是看了个皮毛,因此自己也有不少问题.总体来讲,对于G1我有几个疑惑 ...

  3. 深入浅出 Java CMS 学习笔记

    转载自  深入浅出 Java CMS 学习笔记 引子 带着问题去学习一个东西,才会有目标感,我先把一直以来自己对CMS的一些疑惑罗列了下,希望这篇学习笔记能解决掉这些疑惑,希望也能对你有所帮助. 1. ...

  4. Java NIO学习笔记之图解ByteBuffer

    转载自 Java NIO学习笔记之图解ByteBuffer ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰. <程序员的思维修炼>一本书讲过,主动学习,要 ...

  5. 转载:mongoDB java驱动学习笔记

    http://www.blogjava.net/watchzerg/archive/2012/09/22/388346.html mongoDB java驱动学习笔记 指定新mongo实例: Mong ...

  6. 2019年Java Web学习笔记目录

    Java Web学习笔记目录 1.Java Web学习笔记01:动态网站初体验 2.Java Web学习笔记02:在Intellij里创建Web项目 3.Java Web学习笔记03:JSP元素 4. ...

  7. 【Java基础学习笔记】- Day11 - 第四章 引用类型用法总结

    Java基础学习笔记 - Day11 - 第四章 引用类型用法总结 Java基础学习笔记 - Day11 - 第四章 引用类型用法总结 4.1 class作为成员变量 4.2 interface作为成 ...

  8. Java 虚拟机学习笔记 | 类加载过程和对象的创建流程

    前言 创建对象是 Java 语言绕不开的话题,那么对象是如何创建出来的呢?我们今天就来聊一聊.对象创建第一步就是检查类是否加载,而类的加载又牵扯到类的加载过程.如果单说对象的创建而绕开类的加载过程,感 ...

  9. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

最新文章

  1. php读取xml的值,PHP读取XML 值
  2. 【渝粤教育】 国家开放大学2020年春季 1443卫生信息与文献检索 参考试题
  3. 域名服务商GoDaddy第四季度扭亏为盈
  4. java的classpath
  5. [react] 如何提高组件的渲染效率呢?
  6. 如何监控Android电视桌面,androidTV 电视桌面的效果
  7. python自动化操作应用程序错误_web自动化中踩过的低级错误坑(python+selenium)
  8. 软件测试的学习之路 ----- 数据库的概要图
  9. 【kafka】kafkaProducer 拉取元数据的流程
  10. I.MX6 ifconfig: SIOCSIFHWADDR: Cannot assign requested address
  11. 新写的一个商品比较控件CompareGrid,没有做设计视图。有兴趣的联络我。公布源码。...
  12. 虚拟机未安装音频设备_如何使用虚拟音频设备录制PC的音频
  13. 大学生试用期辞退之没有工钱//2021-1-22
  14. 华为p20支持手机云闪付吗_华为哪些手机支持云闪付
  15. 推荐系统 | 基础推荐模型 | 逻辑回归模型 | LS-PLM | PyTorch实现
  16. 兼容IE9的文件上传
  17. 游戏类型分类-游戏的分类有哪些
  18. 编译工具 Ninja 介绍
  19. python实现雪花动态图_python实现雪花飘落效果
  20. destoon模板安装方法

热门文章

  1. Webug4.0靶场通关
  2. 算法平台在线服务体系的演进与实践
  3. php crypt,PHP加密函数—crypt()函数加密用法实例
  4. mooc作业怎么上传附件_当下不考虑5G,坚果Pro3与一加7t,你怎么选?
  5. Openstack 之镜像管理服务Glance
  6. 简单rides和Memory切换缓存 Rides工具类主要方法
  7. c语言蜂鸣器放音乐程序,单片机按键蜂鸣器演奏歌曲功能C程序
  8. python语言读后感_Python自然语言处理读后感锦集
  9. c语言编译流程简单整理以及简单makefile编写
  10. python串口编程整理