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

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

VisualVM

當你日復一日敲代碼的時候,當你把各類各樣的框架集成到一塊兒的時候,看着大功告成成功運行的日誌,有沒有那麼一絲絲迷茫和惆悵:這TM起的是什麼玩意?每一行日誌背後表明的是什麼東西??他爲何就能跑起來了呢????html

這種時候不要慌,給你們推薦一款功能強大的插件:VisualVM Launcher。(eclipse就叫 VisualVM)。這個插件須要和客戶端配合使用 VisualVMjava

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

  • 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內存分配,內存大小,裝載類總數,線程總數等。有了這些信息,就能夠很快的進程診斷,性能調優辣。github

安裝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 --> 選擇對應的系統安裝包 --> 對應安裝,安裝完成後打開是這樣的頁面:app


VisualVM和java命令行工具

1. jmap+jhat內存快照與分析:Heap Dump
  1. HeapDump又叫作堆存儲文件,指一個Java進程在某個時間點的內存快照。Heap Dump在觸發內存快照的時候會保存此刻的java對象和類的信息。一般在寫heap Dump文件前會觸發一次FullGC,因此heap dump文件裏保存的都是FullCG後留下的對象信息。框架

  2. jmap進行內存快照方式:eclipse

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

  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也提供了一些其餘功能

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


這篇文章,介紹了VisualVM的做用和用法,下面會寫一篇姊妹篇 點這裏 帶上代碼,去分析當系統出現死鎖或者循環等異常時,內存、線程和CPU在作什麼。


歡迎訪問個人我的博客

相關文章
相關標籤/搜索