Java - JVM - jhat 简介
-
概述
- jhat 简介
- 感觉似乎派不上什么用处
-
背景
- 了解 jmap 之后, 我发现我还剩下了一个 dump 文件
- jhat 刚好就是用来处理这个玩意的...
- 了解 jmap 之后, 我发现我还剩下了一个 dump 文件
-
环境
- OS
- win10
- Java
- 1.8.0_201
- demo
- Spring Boot
- 2.1.3
- Spring Boot
- shell
- win10 cmd
- OS
1. 准备
-
启动一个 java 程序
- 我用的是 spring-boot webmvc 的 hello world
-
jps
- 找到开始进程的 pid
-
当然最好有点 jvm 知识
- 我除了模模糊糊知道, jvm 内存分了几个区之外, 其他一概不知...
2. jhat
-
概述
- jhat 简介
-
jhat
-
java 堆 dump 文件分析工具
- dump 文件
- 就是 jmap -dump 获得的文件
- dump 文件
-
工作机制
-
解析 dump 文件
- 略
-
开启服务器
- 解析完 dump 文件之后, 会开启一个 httpserver
- 具体的分析结果, 会以 html 的形式呈现出来
-
-
3. 命令
1. 解析并启动服务
-
命令
>jhat dump.txt Reading from dump.txt... Dump file created Wed Apr 08 20:22:16 CST 2020 Snapshot read, resolving... Resolving 280375 objects... Chasing references, expect 56 dots........................................................ Eliminating duplicate references........................................................ Snapshot resolved. Started HTTP server on port 7000 Server is ready.
-
结果
- 在本机的 7000 端口, 启动了一个 webserver
-
选项
- 略
- 本来还有其他的一些选项, 但是我现在也没有理解太好, 所以就不多说了
- 感兴趣的童鞋, 可以去 官网文档 看看
- 略
4. 结果
-
概述
- 简介 jhat 的结果
- 真的不会太深
-
例子
# 单个包下, 只有一个类的一个对象 Package org.apache.catalina.security class org.apache.catalina.security.SecurityUtil [0x3c1b05858]
1. 默认视图: 所有的类
-
概述
- 默认视图, 展示堆中 所有的类
- 不包含 jvm/java语言 相关的类
- 这个东西还需要确认
- 不包含 jvm/java语言 相关的类
- 默认视图, 展示堆中 所有的类
-
分类
- 通常会根据 包名, 来对 类 做分组...
- 最前面的, 是 arrays
-
对象
-
格式
class org.apache.catalina.security.SecurityUtil [0x3c1b05858]
-
解释
- class org.apache.catalina.security.SecurityUtil
- org.apache.catalina.security.SecurityUtil
- 类名为 org.apache.catalina.security.SecurityUtil
- org.apache.catalina.security.SecurityUtil
- [0x3c1b05858]
- 对象在 内存中 的地址
- class org.apache.catalina.security.SecurityUtil
-
点击类名, 可以查看详细信息
- 疑问
- 有的对象, 以这样的形式呈现
class org.apache.catalina.realm.RealmBase$AllRolesMode
- 那个 $ 到底是什么情况
- 有的对象, 以这样的形式呈现
- 疑问
-
-
其他视图
-
位置
- 页面底部
-
内容
- 所有类
- 包含 jvm/java语言
- rootset 所有陈冠
- 包含 jvm/java语言
- 不含 jvm/java语言
- 堆内存对象统计
- 和 jmap 的 -histo 很像
- 析构统计
- 和 jmap 的 -finalizerinfo 很想
- 执行 OQL
- 通过 OQL 语句, 来查找 dump 文件里的对象
- 这玩意我暂时不讲
- 页面里 自带帮助
- 通过 OQL 语句, 来查找 dump 文件里的对象
- 所有类
-
2. 对象视图: 单个对象
- 概述
- 单个对象相关的内容
- 一圈看下来, 全是略, 我擦这....
1. 父类
- 这个简单, 我就不说了
2. 加载器细节
-
略
- 真心没学好
-
内容
- 加载器
- 签署器 - Signers
- 保护域
3. 子类
-
略
- 这个也没学好
-
内容
- 实例数据成员
- 静态数据成员
- 实例
4. 被引用列表
- 略
5. 引用列表
- 略
6. 其他查询
- 引用链
- 略
ps
-
ref
- jhat
- 官网文档, 不过很简单
- 中间讲述 dump 文件由来的四种方式, 可以一看...
- HPROF: A Heap/CPU Profiling Tool
- hprof 的官方文档
- hprof 是一个原生的内存分析工具
- 具体的我可能以后会去了解
- hprof 的官方文档
- jhat
-
后续
- 看懂 单个对象 的视图
- 理解 OQL
- 类型加载
- 之前写过一个 生命周期, 但老实说我还是有点模糊...
- 内存模型
- jstack
- 其他可视化工具
- 学会了工具, 当然是尝试分析具体的问题了
尽量尝试解释清楚; 自己校对能力有限, 如果有错误欢迎指出