Java - JVM - visualvm dump 与 snapshot
-
概述
- visualvm 中 dump 和 snapshot 简介
-
背景
- 一个 visualvm 的简介, 墨迹了一周...
- 堆完了发现, snapshot 一句都没有提
- 你好意思吗?
- 所以现在开始简单聊聊 snapshot
-
环境
- OS
- win10
- Java
- 1.8.0_201
- demo
- Spring Boot
- 2.1.3
- Spring Boot
- shell
- win10 cmd
- OS
1. 准备
- 示例进程
- 随便起了个 spring-boot 的 webmvc 工程
- 写个 hello world 之类的就行
- 以下简称 demo
- 随便起了个 spring-boot 的 webmvc 工程
2. dump 与 snapshot
- 概述
- 简述 visualvm 中 dump 和 snapshot 的区别
1. 原理
-
概述
- 概念上的对比
- 看不看没啥影响
-
dump
- 备份
- 将信息完完整整的复制一份
- 备份
-
snapshot
- 快照
- 仅仅做保存一个 逻辑备份
- 说来话长, 这里只能说, 不是保留实际的数据
- 所以产生的很快
- 仅仅做保存一个 逻辑备份
- 快照
-
visualvm
-
我目前无法确定 dump 和 snap 在 原理上的差别, 是否是这些
-
我能确定的, 是文件的大小
- 我的堆 snapshot 大小为 50K
- 我的堆 dump 大小为 32M
-
对于 dump 和 snapshot 感兴趣的同学, 可以从后面的 ref 里继续深入了解
- 这块在 存储 里, 算是 一个重要的基础概念
-
2. visualvm 里的 dump 和 snapshot
-
概述
- visualvm 的 dump 和 snapshot
-
dump
- 线程 dump
- 内容
- 执行操作时, jvm 的 线程 以及 jvm栈 信息
- 内容
- 堆 dump
- 内容
- 执行操作时, jvm 堆中所有类 的情况
- 内容
- 线程 dump
-
snapshot
- 线程 snapshot
- 内容
- 应用线程的调用情况
- 不包括 jvm 的线程
- 应用线程的调用情况
- 内容
- 堆 snapshot
- 内容
- 执行快照时 堆内存 的情况
- 活动内存
- 内容
- 应用程序 snapshot
- 内容
- 应用的快照...
- 内容
- 线程 snapshot
3. dump
- 概述
- dump
1. 线程 dump
-
概述
- 线程的 dump
- 用来查看 对象 详细信息
- 值
- 关联
- 线程的 本地变量
-
产生
-
方式1
- 应用程序 控件下, 选中要产生 dump 的 jvm
- 右键 jvm
- 单击 堆Dump
-
方式2
- 应用程序 控件下, 选中要产生 dump 的 jvm
- 菜单栏 > 应用程序 > 堆Dump
-
-
内容
1. 概要
-
概述
- 基本信息
- dump 的属性
- 堆的 概括信息
- 环境
- 我没法讲
- 我这显示 不可用
- 我没法讲
- 系统属性
- 我没法讲
- 我这显示 不可用
- 我没法讲
- 显示线程
- 默认不显示
- 显示类似 jstack 的内容
- 应用线程甚至可以看到 线程的 本地变量
- 基本信息
-
检查
- 可以搜索 jvm 里 大小 topn 的对象
- 部分对象, 可以查看对象内部具体情况
- 可以搜索 jvm 里 大小 topn 的对象
2. 类
- 数据 - 行
- 类名
- 实例数 [%]
- 实例数
- 大小
- 保留
- ?
3. 实例数
-
概述
- 展示类型对象的信息
-
路径
- 路径1
- 概要 里 显示线程 的 local Variable 跳转过来
- 路径2
- 概要 里 检查 的结果
- 路径3
- 类 双击特定类型, 跳转过来
- 路径1
-
类型信息
-
同 类 视图下的 行数据
-
实例数
-
分组
- 如果实例太多, 会以 500 个为单位显示一组
-
数据 - 行
- 实例
- 实例编号
- 每个类独立算
- 从 1 开始
- ID
- 实例的在 jvm 中的id
- 大小
- 单位是 B
- 保留
- 不太懂
- 实例
-
-
-
值
- 某些类型会显示对象的值
- 比如 String 类型, 会显示 字符串内容
- 某些类型会显示对象的值
-
字段
- 数据 - 行
- 字段
- 字段名称
- 类型
- 字段类型
- String
- 字段类型
- 全限定类型
- 类型全名
- java.lang.String
- 类型全名
- 值
- 基本类型
- 显示值
- 引用类型
- null
- 对象编号
- 可以跳转
- 基本类型
- 大小
- 保留 ?
- 字段
- 数据 - 行
-
引用
- 查看被 什么对象 持有
- 数据 - 行
- 略
- 同 字段
-
OQL 控制台
- 略
- 右下角有 现成的模板
- 想要尝试的同学, 可以先自己试试
- 语法有点类似 sql
- 以后随缘讲讲
- 略
2. 线程 dump
-
概述
- 线程的 dump 信息
- 类似 jstack -L 的信息
-
产生
- 类似 堆 dump
- 路径都相同, 我就不细说了
4. snapshot
1. 应用程序 snapshot
-
概述
- 应用基本信息
-
产生
- 类似 堆 dump
- 路径相同, 我就不说了
-
注意
- 如果应用下有 dump 或者 snapshot
- 产生 应用dump 时, 会把这些作为它的子元素
- 如果应用下有 dump 或者 snapshot
1. 概述
- jvm dump 时的 概述情况
- 基本信息
- jvm 参数
- 系统信息
2. 监视
- 短期内主要资源的趋势图
- CPU
- 堆/Metaspace
- 类
- 线程
3. 线程
- 同 jvm 线程视图
- 不同的是, 停止在了 snapshot 的那个时刻
2. CPU snapshot
-
概述
- 线程快照
-
产生
-
路径1
取样器 > CPU > CPU 样例 > 快照
-
路劲2
Profiler > CPU > 快照
-
1. 信息
-
概要
- snapshot 产生时间
- snapshot 文件属性
-
用户注释
- 用户可以添加信息
-
设置
- 快照生成时的配置
2. 调用树
-
数据 - 行
- 调用树 - 方法
- 方法名称
- 总时间 [%]
- 总时间
- 调用
- 调用次数
- 调用树 - 方法
-
方法树
- 树
- 本质是一个类似 调用栈 的结构
- 可以看到, 栈内每个方法的时间
- 树
3. 热点
- 略
- 方法的执行频率 和 执行时间
4. 组合
- 把 调用树 和 热点 拼到一起了
- 略
3. 内存 snapshot
-
概述
- 内存快照
-
产生
-
路径1
取样器 > 内存 > 快照
-
路劲2
Profiler > 内存 > 快照
-
1. 信息
-
概要
- 收集时间
- 文件信息
-
用户注释
- 略
-
设置
- 产生快照时的设置
2. 内存结果
- 数据 - 行
- 类名 - 活动的分配对象
- 活动字节[%]
- 活动字节
- 活动对象
- 年代数
5. 导出
-
概述
- 这些 dump 和 snapshot 都可以导出
-
dump
- cpu
- .tdump 文件
- 内存
- .hprof 文件
- cpu
-
snapshot
- 应用
- .apps 文件
- cpu
- .nps 文件
- 内存
- .nps 文件
- 应用
ps
- ref
-
快照与备份有什么区别?快照是备份的其中一种么?还是两种不同的概念?
- 来自用户 木头龙 的回答
- 道理讲得是那么回事, 问题是为啥一定要把 原件 和 快照 的地址画在一张表里
- 明明分开看会更加清晰
- 道理讲得是那么回事, 问题是为啥一定要把 原件 和 快照 的地址画在一张表里
- 来自用户 木头龙 的回答
-
- 道理讲得是那么回事
- 但是 讲解上感觉有点粗糙, 讲一个操作把所有步骤揉在一起, 理解起来不那么清晰
- 动图 效果还不如静态图
- 道理讲得是那么回事
-
- 保留空间的解释
-
尽量尝试解释清楚; 自己校对能力有限, 如果有错误欢迎指出