Java - JVM - jhat 简介

  1. 概述

    1. jhat 简介
    2. 感觉似乎派不上什么用处
  2. 背景

    1. 了解 jmap 之后, 我发现我还剩下了一个 dump 文件
      1. jhat 刚好就是用来处理这个玩意的...
  3. 环境

    1. OS
      1. win10
    2. Java
      1. 1.8.0_201
    3. demo
      1. Spring Boot
        1. 2.1.3
    4. shell
      1. win10 cmd

1. 准备

  1. 启动一个 java 程序

    1. 我用的是 spring-boot webmvc 的 hello world
  2. jps

    1. 找到开始进程的 pid
  3. 当然最好有点 jvm 知识

    1. 我除了模模糊糊知道, jvm 内存分了几个区之外, 其他一概不知...

2. jhat

  1. 概述

    1. jhat 简介
  2. jhat

    1. java 堆 dump 文件分析工具

      1. dump 文件
        1. 就是 jmap -dump 获得的文件
    2. 工作机制

      1. 解析 dump 文件

      2. 开启服务器

        1. 解析完 dump 文件之后, 会开启一个 httpserver
        2. 具体的分析结果, 会以 html 的形式呈现出来

3. 命令

1. 解析并启动服务

  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.
    
  2. 结果

    1. 在本机的 7000 端口, 启动了一个 webserver
  3. 选项

      1. 本来还有其他的一些选项, 但是我现在也没有理解太好, 所以就不多说了
      2. 感兴趣的童鞋, 可以去 官网文档 看看

4. 结果

  1. 概述

    1. 简介 jhat 的结果
    2. 真的不会太深
  2. 例子

    # 单个包下, 只有一个类的一个对象
    Package org.apache.catalina.security
    class org.apache.catalina.security.SecurityUtil [0x3c1b05858]
    

1. 默认视图: 所有的类

  1. 概述

    1. 默认视图, 展示堆中 所有的类
      1. 不包含 jvm/java语言 相关的类
        1. 这个东西还需要确认
  2. 分类

    1. 通常会根据 包名, 来对 类 做分组...
    2. 最前面的, 是 arrays
  3. 对象

    1. 格式

      class org.apache.catalina.security.SecurityUtil [0x3c1b05858]
      
    2. 解释

      1. class org.apache.catalina.security.SecurityUtil
        1. org.apache.catalina.security.SecurityUtil
          1. 类名为 org.apache.catalina.security.SecurityUtil
      2. [0x3c1b05858]
        1. 对象在 内存中 的地址
    3. 点击类名, 可以查看详细信息

      1. 疑问
        1. 有的对象, 以这样的形式呈现 class org.apache.catalina.realm.RealmBase$AllRolesMode
          1. 那个 $ 到底是什么情况
  4. 其他视图

    1. 位置

      1. 页面底部
    2. 内容

      1. 所有类
        1. 包含 jvm/java语言
      2. rootset 所有陈冠
        1. 包含 jvm/java语言
        2. 不含 jvm/java语言
      3. 堆内存对象统计
        1. 和 jmap 的 -histo 很像
      4. 析构统计
        1. 和 jmap 的 -finalizerinfo 很想
      5. 执行 OQL
        1. 通过 OQL 语句, 来查找 dump 文件里的对象
          1. 这玩意我暂时不讲
          2. 页面里 自带帮助

2. 对象视图: 单个对象

  1. 概述
    1. 单个对象相关的内容
    2. 一圈看下来, 全是略, 我擦这....

1. 父类

  1. 这个简单, 我就不说了

2. 加载器细节

    1. 真心没学好
  1. 内容

    1. 加载器
    2. 签署器 - Signers
    3. 保护域

3. 子类

    1. 这个也没学好
  1. 内容

    1. 实例数据成员
    2. 静态数据成员
    3. 实例

4. 被引用列表

5. 引用列表

6. 其他查询

  1. 引用链

ps

  1. ref

    1. jhat
      1. 官网文档, 不过很简单
      2. 中间讲述 dump 文件由来的四种方式, 可以一看...
    2. HPROF: A Heap/CPU Profiling Tool
      1. hprof 的官方文档
        1. hprof 是一个原生的内存分析工具
        2. 具体的我可能以后会去了解
  2. 后续

    1. 看懂 单个对象 的视图
    2. 理解 OQL
    3. 类型加载
      1. 之前写过一个 生命周期, 但老实说我还是有点模糊...
    4. 内存模型
    5. jstack
    6. 其他可视化工具
    7. 学会了工具, 当然是尝试分析具体的问题了
posted @ 2020-04-08 21:41  轩辕拾銉  阅读(273)  评论(0编辑  收藏  举报