Java - JVM - visualvm dump 与 snapshot

Posted 轩辕拾銉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java - JVM - visualvm dump 与 snapshot相关的知识,希望对你有一定的参考价值。

  1. 概述

    1. visualvm 中 dump 和 snapshot 简介
  2. 背景

    1. 一个 visualvm 的简介, 墨迹了一周...
    2. 堆完了发现, snapshot 一句都没有提
      1. 你好意思吗?
    3. 所以现在开始简单聊聊 snapshot
  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. 示例进程
    1. 随便起了个 spring-boot 的 webmvc 工程
      1. 写个 hello world 之类的就行
      2. 以下简称 demo

2. dump 与 snapshot

  1. 概述
    1. 简述 visualvm 中 dump 和 snapshot 的区别

1. 原理

  1. 概述

    1. 概念上的对比
    2. 看不看没啥影响
  2. dump

    1. 备份
      1. 将信息完完整整的复制一份
  3. snapshot

    1. 快照
      1. 仅仅做保存一个 逻辑备份
        1. 说来话长, 这里只能说, 不是保留实际的数据
        2. 所以产生的很快
  4. visualvm

    1. 我目前无法确定 dump 和 snap 在 原理上的差别, 是否是这些

    2. 我能确定的, 是文件的大小

      1. 我的堆 snapshot 大小为 50K
      2. 我的堆 dump 大小为 32M
    3. 对于 dump 和 snapshot 感兴趣的同学, 可以从后面的 ref 里继续深入了解

      1. 这块在 存储 里, 算是 一个重要的基础概念

2. visualvm 里的 dump 和 snapshot

  1. 概述

    1. visualvm 的 dump 和 snapshot
  2. dump

    1. 线程 dump
      1. 内容
        1. 执行操作时, jvm 的 线程 以及 jvm栈 信息
    2. 堆 dump
      1. 内容
        1. 执行操作时, jvm 堆中所有类 的情况
  3. snapshot

    1. 线程 snapshot
      1. 内容
        1. 应用线程的调用情况
          1. 不包括 jvm 的线程
    2. 堆 snapshot
      1. 内容
        1. 执行快照时 堆内存 的情况
        2. 活动内存
    3. 应用程序 snapshot
      1. 内容
        1. 应用的快照...

3. dump

  1. 概述
    1. dump

1. 线程 dump

  1. 概述

    1. 线程的 dump
    2. 用来查看 对象 详细信息
      1. 关联
      2. 线程的 本地变量
  2. 产生

    1. 方式1

      1. 应用程序 控件下, 选中要产生 dump 的 jvm
      2. 右键 jvm
      3. 单击 堆Dump
    2. 方式2

      1. 应用程序 控件下, 选中要产生 dump 的 jvm
      2. 菜单栏 > 应用程序 > 堆Dump
  3. 内容

1. 概要

  1. 概述

    1. 基本信息
      1. dump 的属性
      2. 堆的 概括信息
    2. 环境
      1. 我没法讲
        1. 我这显示 不可用
    3. 系统属性
      1. 我没法讲
        1. 我这显示 不可用
    4. 显示线程
      1. 默认不显示
      2. 显示类似 jstack 的内容
        1. 应用线程甚至可以看到 线程的 本地变量
  2. 检查

    1. 可以搜索 jvm 里 大小 topn 的对象
      1. 部分对象, 可以查看对象内部具体情况

2. 类

  1. 数据 - 行
    1. 类名
    2. 实例数 [%]
    3. 实例数
    4. 大小
    5. 保留
      1. ?

3. 实例数

  1. 概述

    1. 展示类型对象的信息
  2. 路径

    1. 路径1
      1. 概要 里 显示线程 的 local Variable 跳转过来
    2. 路径2
      1. 概要 里 检查 的结果
    3. 路径3
      1. 类 双击特定类型, 跳转过来
  3. 类型信息

    1. 同 类 视图下的 行数据

    2. 实例数

      1. 分组

        1. 如果实例太多, 会以 500 个为单位显示一组
      2. 数据 - 行

        1. 实例
          1. 实例编号
          2. 每个类独立算
          3. 从 1 开始
        2. ID
          1. 实例的在 jvm 中的id
        3. 大小
          1. 单位是 B
        4. 保留
          1. 不太懂
    1. 某些类型会显示对象的值
      1. 比如 String 类型, 会显示 字符串内容
  4. 字段

    1. 数据 - 行
      1. 字段
        1. 字段名称
      2. 类型
        1. 字段类型
          1. String
      3. 全限定类型
        1. 类型全名
          1. java.lang.String
        1. 基本类型
          1. 显示值
        2. 引用类型
          1. null
          2. 对象编号
            1. 可以跳转
      4. 大小
      5. 保留 ?
  5. 引用

    1. 查看被 什么对象 持有
    2. 数据 - 行
      1. 同 字段
  6. OQL 控制台

      1. 右下角有 现成的模板
      2. 想要尝试的同学, 可以先自己试试
      3. 语法有点类似 sql
      4. 以后随缘讲讲

2. 线程 dump

  1. 概述

    1. 线程的 dump 信息
    2. 类似 jstack -L 的信息
  2. 产生

    1. 类似 堆 dump
    2. 路径都相同, 我就不细说了

4. snapshot

1. 应用程序 snapshot

  1. 概述

    1. 应用基本信息
  2. 产生

    1. 类似 堆 dump
    2. 路径相同, 我就不说了
  3. 注意

    1. 如果应用下有 dump 或者 snapshot
      1. 产生 应用dump 时, 会把这些作为它的子元素

1. 概述

  1. jvm dump 时的 概述情况
    1. 基本信息
    2. jvm 参数
    3. 系统信息

2. 监视

  1. 短期内主要资源的趋势图
    1. CPU
    2. 堆/Metaspace
    3. 线程

3. 线程

  1. 同 jvm 线程视图
    1. 不同的是, 停止在了 snapshot 的那个时刻

2. CPU snapshot

  1. 概述

    1. 线程快照
  2. 产生

    1. 路径1

      取样器 > CPU > CPU 样例 > 快照
      
    2. 路劲2

      Profiler > CPU > 快照
      

1. 信息

  1. 概要

    1. snapshot 产生时间
    2. snapshot 文件属性
  2. 用户注释

    1. 用户可以添加信息
  3. 设置

    1. 快照生成时的配置

2. 调用树

  1. 数据 - 行

    1. 调用树 - 方法
      1. 方法名称
    2. 总时间 [%]
    3. 总时间
    4. 调用
      1. 调用次数
  2. 方法树

      1. 本质是一个类似 调用栈 的结构
      2. 可以看到, 栈内每个方法的时间

3. 热点

    1. 方法的执行频率 和 执行时间

4. 组合

  1. 把 调用树 和 热点 拼到一起了

3. 内存 snapshot

  1. 概述

    1. 内存快照
  2. 产生

    1. 路径1

      取样器 > 内存 > 快照
      
    2. 路劲2

      Profiler > 内存 > 快照
      

1. 信息

  1. 概要

    1. 收集时间
    2. 文件信息
  2. 用户注释

  3. 设置

    1. 产生快照时的设置

2. 内存结果

  1. 数据 - 行
    1. 类名 - 活动的分配对象
    2. 活动字节[%]
    3. 活动字节
    4. 活动对象
    5. 年代数

5. 导出

  1. 概述

    1. 这些 dump 和 snapshot 都可以导出
  2. dump

    1. cpu
      1. .tdump 文件
    2. 内存
      1. .hprof 文件
  3. snapshot

    1. 应用
      1. .apps 文件
    2. cpu
      1. .nps 文件
    3. 内存
      1. .nps 文件

ps

  1. ref
    1. 快照与备份有什么区别?快照是备份的其中一种么?还是两种不同的概念?

      1. 来自用户 木头龙 的回答
        1. 道理讲得是那么回事, 问题是为啥一定要把 原件 和 快照 的地址画在一张表里
          1. 明明分开看会更加清晰
    2. 快照是什么?揭秘存储快照的实现

      1. 道理讲得是那么回事
        1. 但是 讲解上感觉有点粗糙, 讲一个操作把所有步骤揉在一起, 理解起来不那么清晰
        2. 动图 效果还不如静态图
    3. java对象大小及浅堆、深堆、保留内存的概念

      1. 保留空间的解释

以上是关于Java - JVM - visualvm dump 与 snapshot的主要内容,如果未能解决你的问题,请参考以下文章

VisualVM监控JVM

visualvm监控jvm及远程jvm监控方法

visualVM远程监控JVM

使用Java visualVM监控远程JVM

使用Java VisualVM监控远程JVM cpu jps

深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战