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. 保留空間的解釋


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM