-
概述
- 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
-
快照與備份有什么區別?快照是備份的其中一種么?還是兩種不同的概念?
- 來自用戶 木頭龍 的回答
- 道理講得是那么回事, 問題是為啥一定要把 原件 和 快照 的地址畫在一張表里
- 明明分開看會更加清晰
- 道理講得是那么回事, 問題是為啥一定要把 原件 和 快照 的地址畫在一張表里
- 來自用戶 木頭龍 的回答
-
- 道理講得是那么回事
- 但是 講解上感覺有點粗糙, 講一個操作把所有步驟揉在一起, 理解起來不那么清晰
- 動圖 效果還不如靜態圖
- 道理講得是那么回事
-
- 保留空間的解釋
-