1. 程式人生 > >Java效能分析神器--VisualVM Launcher[1]

Java效能分析神器--VisualVM Launcher[1]

Java效能分析神器1--VisualVM Launcher

VisualVM

當你日復一日敲程式碼的時候,當你把各種各樣的框架整合到一起的時候,看著大功告成成功執行的日誌,有沒有那麼一絲絲迷茫和惆悵:這TM起的是什麼玩意?每一行日誌背後代表的是什麼東西??他為什麼就能跑起來了呢????

這種時候不要慌,給大家推薦一款功能強大的外掛:VisualVM Launcher。(eclipse就叫 VisualVM)。這個外掛需要和客戶端配合使用 VisualVM。

VisualVM是集成了命令列JDK工具和輕量級分析功能的視覺化工具。JVM提供了一些常用的jdk命令列工具:

  • jstat(JVM Statistics Monitoring Tool):用於收集Hotspot虛擬機器各方面的執行資料(檢視虛擬機器各雲心狀態資訊),顯示本地或遠端虛擬機器程序中的類裝載,記憶體,垃圾收集, JIT編譯等執行資料。
  • jps(JVM Process Status Tool):顯示指定系統內所有的HotSpot虛擬機器程序(檢視虛擬機器程序資訊),可用於查詢正在執行的虛擬機器程序, 同時可選擇性的顯示虛擬機器執行主類, 即執行main函式的類, 以及程序的本地虛擬機器
    ID(Local Virtual Machine Identifier 簡稱LVMID)(對於本地虛擬機器程序來說, 程序的本地虛擬機器ID與作業系統的程序ID是一致的)
  • jinfo(Configuration Info for Java):顯示虛擬機器配置資訊(檢視虛擬機器配置引數資訊),可用於檢視和調整虛擬機器的配置引數.
  • jmap(JVM Memory Map):生成虛擬機器的記憶體轉儲快照, 生成heapdump檔案(生成虛擬機器記憶體轉儲快照),可用於獲取heapdump檔案, 且可以查詢finalize執行佇列, Java堆與永久代的一些資訊。
  • jhat(JVM Heap Dump Browser):用於分析heapdump檔案, 它會建立一個HTTP/HTML伺服器, 讓使用者在瀏覽器上檢視分析結果(分析虛擬機器轉儲快照資訊),jhat命令與jmap命令搭配使用, 用於分析jmap生成的堆轉儲快照, jhat內建了一個微型的HTTP/HTML伺服器, 生成dump檔案的分析結果後, 可以在瀏覽器中檢視。
  • jstack(JVM Stack Trace):顯示虛擬機器的執行緒快照(虛擬機器堆疊跟蹤),用於生成虛擬機器當前時刻的執行緒快照。 執行緒快照指的是當前虛擬機器內的每一條執行緒正在執行的方法堆疊的集合, 生成執行緒快照的作用是, 可用於定位執行緒出現長時間停頓的原因, 如執行緒間死鎖, 死迴圈, 請求外部資源導致的長時間等待等問題, 當執行緒出現停頓時 就可以用jstack各個執行緒呼叫的堆疊情況

這些工具功能強大,可以很方便的檢視jvm記憶體分配,記憶體大小,裝載類總數,執行緒總數等。有了這些資訊,就可以很快的程序診斷,效能調優辣。

安裝VisualVM和VisualVM Launcher

1. Idea安裝VisualVM Launcher外掛

​ Preferences --> Plugins --> 搜尋VisualVM Launcher,安裝重啟即可

2. 配置Idea VisualVM Launcher外掛

​ Preferences --> other settings -> VisualVM Launcher --> 輸入VisualVM executable 和 JDK home即可

3. 配置完之後的idea頁面

4. 安裝VisualVM客戶端

​ http://visualvm.github.io/download.html --> 選擇對應的系統安裝包 --> 對應安裝,安裝完成後開啟是這樣的頁面:


VisualVM和java命令列工具

1. jmap+jhat記憶體快照與分析:Heap Dump
  1. HeapDump又叫做堆儲存檔案,指一個Java程序在某個時間點的記憶體快照。Heap Dump在觸發記憶體快照的時候會儲存此刻的java物件和類的資訊。通常在寫heap Dump檔案前會觸發一次FullGC,所以heap dump檔案裡儲存的都是FullCG後留下的物件資訊。

  2. jmap進行記憶體快照方式:

    jmap -dump:format=b,file=<filename.hprof> <pid>

  3. jhat進行記憶體快照分析:

    • jhat <heap dump file>
    • 使用了jhat命令,就啟動了一個http服務,埠是7000,即http://localhost:7000/,就可以在瀏覽器裡分析
  4. VisualVM進行記憶體快照方式:

    • 在“應用程式”視窗中右鍵單擊應用程式節點,然後選擇“堆 Dump”。
    • 在“應用程式”視窗中雙擊應用程式節點以開啟應用程式標籤,然後在“監視”標籤中單擊“堆 Dump”。
  5. VisualVM快照頁面,也可以右鍵儲存此時的快照:

  6. 想要開啟儲存好的java快照:

    • 單擊“堆 Dump”工具欄中的“類”,以檢視活動類和對應例項的列表。
    • 雙擊某個類名開啟“例項”檢視,以檢視例項列表。
    • 從列表中選擇某個例項,以檢視對該例項的引用。
2. jinfo:顯示虛擬機器配置資訊(檢視虛擬機器配置引數資訊)
  1. 虛擬機器配置資訊:JVM的啟動引數

  2. jinfo進行檢視虛擬機器配置資訊查詢(jinfo -help檢視更多)

    jinfo <pid>

  3. Visual VM檢視虛擬機器配置資訊,直接在應用程式開啟,就可以看到JVM引數 和 系統屬性:

  4. 一些常見的虛擬機器配置引數:

    • -Xms:初始堆大小。如:-Xms256m
    • -Xmx:最大堆大小。如:-Xmx512m
    • -Xmn:新生代大小。通常為 Xmx 的 1/3 或 1/4。
    • -Xss:為每個執行緒分配的記憶體大小,JDK1.5+ 每個執行緒堆疊大小為 1M,一般來說如果棧不是很深的話, 1M 是絕對夠用了的。
    • -XX:NewRatio:新生代與老年代的比例,如 –XX:NewRatio=2,則新生代佔整個堆空間的1/3,老年代佔2/3
    • -XX:SurvivorRatio:新生代中 Eden 與 Survivor 的比值。預設值為 8。即 Eden 佔新生代空間的 8/10,另外兩個 Survivor 各佔 1/10
    • -XX:PermSize:永久代(方法區)的初始大小
      • PermSize永久代的概念在jdk1.8中已經不存在了,取而代之的是metaspace元空間,當認為執行永久代的初始大小以及最大值是jvm會給出如此下提示:
        • Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=30m; support was removed in 8.0
        • Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=30m; support was removed in 8.0
    • -XX:MaxPermSize:永久代(方法區)的最大值
    • -XX:+PrintGCDetails:列印 GC 資訊
    • -XX:+HeapDumpOnOutOfMemoryError:讓虛擬機器在發生記憶體溢位時 Dump 出當前的記憶體堆轉儲快照,以便分析用
3. jps檢視虛擬機器程序資訊
  1. 用來查詢正在執行的虛擬機器程序

  2. jps命令,詳情檢視:

    • jps
  3. VisualVM檢視正在執行的虛擬機器程序:

4. jstack顯示虛擬機器的執行緒快照
  1. 生成虛擬機器當前時刻的執行緒快照,用來查詢執行時死鎖,死迴圈的原因

  2. jstack命令,詳情檢視

    • jstack <pid>
  3. VisualVM生成虛擬機器執行緒快照方式:

    • 在“應用程式”視窗中右鍵單擊應用程式節點,然後選擇“執行緒 Dump”。
    • 在“應用程式”視窗中雙擊應用程式節點以開啟應用程式標籤,然後在“執行緒”標籤中單擊“執行緒 Dump”。
  4. VisualVM執行緒快照頁面,也可以右鍵儲存快照:

5. jstat收集Hotspot虛擬機器各方面的執行資料
  1. 執行資料:對Java應用程式的資源和效能進行實時監控,主要包括GC情況和Heap Size資源使用情況。

  2. jstat進行資源與效能監控,詳情檢視:

    • jstat -gc <pid>
  3. VisualVM進行程式資源的實時監控:


VisualVM也提供了一些其他功能

  • JMX代理連線
  • 遠端環境監控
  • CPU分析和記憶體分析

此外,VisualVM也提供很多外掛,有各樣的功能,我就不多介紹了


這篇文章,介紹了VisualVM的作用和用法,下面會寫一篇姊妹篇 點這裡 帶上程式碼,去分析當系統出現死鎖或者迴圈等異常時,記憶體、執行緒和CPU在做什麼。


歡迎訪問我的個人博