转载自 [中级]Java命令学习系列(五)——jhat

jhat(Java Heap Analysis Tool),是一个用来分析java的堆情况的命令。之前的文章讲到过,使用jmap可以生成Java堆的Dump文件。生成dump文件之后就可以用jhat命令,将dump文件转成html的形式,然后通过http访问可以查看堆情况。

jhat命令解析会Java堆dump并启动一个web服务器,然后就可以在浏览器中查看堆的dump文件了。

实例

一、导出dump文件

关于dump文件的生成可以看jmap命令的详细介绍.

1、运行java程序

/*** Created by hollis on 16/1/21.*/
public class JhatTest {public static void main(String[] args) {while(true) {String string = new String("hollis");System.out.println(string);}}
}

2、查看该进程的ID

HollisMacBook-Air:apaas hollis$ jps -l
68680 org.jetbrains.jps.cmdline.Launcher
62247 com.intellij.rt.execution.application.AppMain
69038 sun.tools.jps.Jps

使用jps命令查看发现有三个java进程在运行,一个是我的IDEA使用的进程68680,一个是JPS命令使用的进程69038,另外一个就是上面那段代码运行的进程62247。

3、生成dump文件

jmap -dump:format=b,file=heapDump 62247
Dumping heap to /Users/hollis/workspace/test/heapDump ...
Heap dump file created

以上命令可以将进程6900的堆dump文件导出到heapDump文件中。 查看当前目录就能看到heapDump文件。

除了使用jmap命令,还可以通过以下方式:

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

2、虚拟机启动时如果指定了 -XX:+HeapDumpOnOutOfMemoryError 选项, 则在抛出 OutOfMemoryError 时, 会自动执行堆转储。

3、使用 hprof 命令

二、解析Java堆转储文件,并启动一个 web server

HollisMacBook-Air:apaas hollis$ jhat heapDump
Reading from heapDump...
Dump file created Thu Jan 21 18:59:51 CST 2016
Snapshot read, resolving...
Resolving 341297 objects...
Chasing references, expect 68 dots....................................................................
Eliminating duplicate references....................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

使用jhat命令,就启动了一个http服务,端口是7000

然后在访问http://localhost:7000/

页面如下:

三、分析

在浏览器里面看到dump文件之后就可以进行分析了。这个页面会列出当前进程中的所有对像情况。

该页面提供了几个查询功能可供使用:

All classes including platform//
Show all members of the rootset
Show instance counts for all classes (including platform)
Show instance counts for all classes (excluding platform)
Show heap histogram
Show finalizer summary
Execute Object Query Language (OQL) query

一般查看堆异常情况主要看这个两个部分:

Show instance counts for all classes (excluding platform),平台外的所有对象信息。如下图:

Show heap histogram 以树状图形式展示堆情况。如下图:

具体排查时需要结合代码,观察是否大量应该被回收的对象在一直被引用或者是否有占用内存特别大的对象无法被回收。

用法摘要

这一部分放在后面介绍的原因是一般不太使用。

HollisMacBook-Air:~ hollis$ jhat -help
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-version          Report version number-h|-help          Print this help and exit<file>            The file to read

-stack false|true

关闭对象分配调用栈跟踪(tracking object allocation call stack)。 如果分配位置信息在堆转储中不可用. 则必须将此标志设置为 false. 默认值为 true.

-refs false|true

关闭对象引用跟踪(tracking of references to objects)。 默认值为 true. 默认情况下, 返回的指针是指向其他特定对象的对象,如反向链接或输入引用(referrers or incoming references), 会统计/计算堆中的所有对象。

-port port-number

设置 jhat HTTP server 的端口号. 默认值 7000.

-exclude exclude-file

指定对象查询时需要排除的数据成员列表文件(a file that lists data members that should be excluded from the reachable objects query)。 例如, 如果文件列列出了 java.lang.String.value , 那么当从某个特定对象 Object o 计算可达的对象列表时, 引用路径涉及 java.lang.String.value 的都会被排除。

-baseline exclude-file

指定一个基准堆转储(baseline heap dump)。 在两个 heap dumps 中有相同 object ID 的对象会被标记为不是新的(marked as not being new). 其他对象被标记为新的(new). 在比较两个不同的堆转储时很有用.

-debug int

设置 debug 级别. 0 表示不输出调试信息。 值越大则表示输出更详细的 debug 信息.

-version

启动后只显示版本信息就退出

-J< flag >

因为 jhat 命令实际上会启动一个JVM来执行, 通过 -J 可以在启动JVM时传入一些启动参数. 例如, -J-Xmx512m 则指定运行 jhat 的Java虚拟机使用的最大堆内存为 512 MB. 如果需要使用多个JVM启动参数,则传入多个 -Jxxxxxx.

OQL

jhat还提供了一种对象查询语言(Object Query Language),OQL有点类似SQL,可以用来查询。

OQL语句的执行页面: http://localhost:7000/oql/

OQL帮助信息页面为: http://localhost:7000/oqlhelp/

OQL的预发可以在帮助页面查看,这里就不详细讲解了。

[中级]Java命令学习系列(五)——jhat相关推荐

  1. Java命令学习系列

    Java命令学习系列(七)--javap Java命令学习系列(六)--jinfo Java命令学习系列(五)--jhat Java命令学习系列(四)--jstat Java命令学习系列(三)--Jm ...

  2. Java命令学习系列(零)——常见命令及Java Dump介绍

    Java命令学习系列(零)--常见命令及Java Dump介绍 一.常用命令: 在JDK的bin目彔下,包含了java命令及其他实用工具.  jps:查看本机的Java中进程信息.  jstack ...

  3. Java命令学习系列(三)——Jmap

    转载自 Java命令学习系列(三)--Jmap jmap是JDK自带的工具软件,主要用于打印指定Java进程(或核心文件.远程调试服务器)的共享对象内存映射或堆内存细节.可以使用jmap生成Heap ...

  4. [初级]Java命令学习系列(七)——javap

    转载自 [初级]Java命令学习系列(七)--javap javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码. 一般情况下,很少有人使用javap对class文件 ...

  5. [初级]Java命令学习系列(六)——jinfo

    转载自 [初级]Java命令学习系列(六)--jinfo jinfo可以输出java进程.core文件或远程debug服务器的配置信息.这些配置信息包括JAVA系统参数及命令行参数,如果进程运行在64 ...

  6. Java命令学习系列(二)——Jstack

    转载自 Java命令学习系列(二)--Jstack jstack是java虚拟机自带的一种堆栈跟踪工具. 功能 jstack用于生成java虚拟机当前时刻的线程快照.线程快照是当前java虚拟机内每一 ...

  7. Java命令学习系列(四)——jstat

    转载自 Java命令学习系列(四)--jstat jstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具.他可以显示本地或远程虚拟机进程 ...

  8. Java命令学习系列(一)——Jps

    转载自 Java命令学习系列(一)--Jps jps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其id号. jps相当于Solaris进程工具ps.不象"pgrep ...

  9. Java NIO学习系列五:I/O模型

    前面总结了很多IO.NIO相关的基础知识点,还总结了IO和NIO之间的区别及各自适用场景,本文会从另一个视角来学习一下IO,即IO模型.什么是IO模型?对于不同人.在不同场景下给出的答案是不同的,所以 ...

最新文章

  1. 牛X!Github项目中文榜,你想知道不想知道的都有!
  2. JAVA多线程之Runnable和Thread比较
  3. 图普科技招聘有关深度学习的解题?
  4. boost::hana::minimum.by用法的测试程序
  5. SAP系统里的胖接口Fat interface
  6. 程序员学好英语的方法(转)
  7. Java并发编程:volatile关键字解析(转载)
  8. python中main的含义及用法_python中main函数的用法
  9. 深度学习数据集制作_深度学习时代的数据驱动建模之探讨
  10. CI加载model的问题
  11. 【C++】一次遇到的需要加入const属性的情况
  12. c语言之图形编程 pdf,《C语言图形编程》.pdf
  13. 修改注册表禁用谷歌浏览器提示保存密码
  14. 计算机网络拓扑星型结构应用,浅谈计算机网络拓扑结构及其应用.doc
  15. css段落首行缩进,文字间距
  16. python画成绩正态分布图_R统计学(09): 正态分布 (二)
  17. 怎么在合同谈判,计划和执行阶段分别进行范围管理
  18. recovery_minui解说
  19. Delphi图书目录
  20. 一年级课程表(3月1日—3月4日)

热门文章

  1. c语言 大数相加,c/c++开发分享C语言计算大数相加的方法
  2. [MyBatisPlus]条件构造器wapper
  3. [JavaWeb]web相关概念回顾
  4. [剑指offer]面试题18:树的子结构
  5. 操作系统复习题+最终版
  6. python提取文件名的5-6位_python提取文件名
  7. 邻接表1试在邻接表存储结构上实现图的基本操作 insert_vertex 和 insert_arc,相关定义如下:icoding---算法改进--配详细注释
  8. 操作系统——内存管理——分段和分页
  9. Codeforces Round #740 (Div. 2) F. Top-Notch Insertions 线段树 / 平衡树 + 组合数学
  10. P6154 游走 概率dp