天天看點

八、jdk工具之JvisualVM、JvisualVM之二--Java程式性能分析工具Java VisualVM

目錄

一、jdk工具之jps(JVM Process Status Tools)指令使用

二、jdk指令之javah指令(C Header and Stub File Generator)

三、jdk工具之jstack(Java Stack Trace)

四、jdk工具之jstat指令(Java Virtual Machine Statistics Monitoring Tool)

四、jdk工具之jstat指令2(Java Virtual Machine Statistics Monitoring Tool)詳解

五、jdk工具之jmap(java memory map)、 mat之四--結合mat對記憶體洩露的分析

六、jdk工具之jinfo指令(Java Configuration Info)

七、jdk工具之jconsole指令(Java Monitoring and Management Console)

八、jdk工具之JvisualVM、JvisualVM之二--Java程式性能分析工具Java VisualVM

九、jdk工具之jhat指令(Java Heap Analyse Tool)

十、jdk工具之Jdb指令(The Java Debugger)

十一、jdk指令之Jstatd指令(Java Statistics Monitoring Daemon)

十二、jdk工具之jcmd介紹(堆轉儲、堆分析、擷取系統資訊、檢視堆外記憶體)

十三、jdk指令之Java記憶體之本地記憶體分析神器:NMT 和 pmap

VisualVM 是一款免費的\內建了多個JDK 指令行工具的可視化工具,它能為您提供強大的分析能力,對 Java 應用程式做性能分析和調優。這些功能包括生成和分析海量資料、跟蹤記憶體洩漏、監控垃圾回收器、執行記憶體和 CPU 分析,同時它還支援在 MBeans 上進行浏覽和操作。

在記憶體分析上,Java VisualVM的最大好處是可通過安裝Visual GC插件來分析GC(Gabage Collection)趨勢、記憶體消耗詳細狀況。

一  Visual GC(監控垃圾回收器)

Java VisualVM預設沒有安裝Visual GC插件,需要手動安裝,JDK的安裝目錄的bin目露下輕按兩下jvisualvm.exe,即可打開Java VisualVM,點選菜單欄 工具->插件 安裝Visual GC

​​

八、jdk工具之JvisualVM、JvisualVM之二--Java程式性能分析工具Java VisualVM

打開Java VisualVM檢查更新插件時,預設的連接配接連不上,通過浏覽器通路之後發現預設的伺服器已經404,新位址已經遷移到github,下面這個位址裡面有不同版本jdk對應的插件中心位址。 

​​https://visualvm.github.io/pluginscenters.html​​

我從上面的連結中找到Visual GC的下載下傳位址:

八、jdk工具之JvisualVM、JvisualVM之二--Java程式性能分析工具Java VisualVM

下載下傳下來是一個com-sun-tools-visualvm-modules-visualgc.nbm檔案,然後添加安裝它

安裝完成後重新開機Java VisualVM,Visual GC界面自動打開,即可看到JVM中堆記憶體的分代情況

​​​​

被監控的程式運作一段時間後Visual GC顯示如下

八、jdk工具之JvisualVM、JvisualVM之二--Java程式性能分析工具Java VisualVM

要看懂上面的圖必須了解Java虛拟機的一些基本概念:

堆(Heap) :JVM管理的記憶體叫堆

分代:根據對象的生命周期長短,把堆分為3個代:Young,Old和Permanent,根據不同代的特點采用不同的收集算法,揚長避短也。

  1. Young(年輕代)年輕代分三個區。一個Eden區,兩個Survivor區。大部分對象在Eden區中生成。當Eden區滿時,還存活的對象将被複制到Survivor區(兩個中的一個),當這個Survivor區滿時,此區的存活對象将被複制到另外一個Survivor區,當這個Survivor去也滿了的時候,從第一個Survivor區複制過來的并且此時還存活的對象,将被複制“年老區(Tenured)”。需要注意,Survivor的兩個區是對稱的,沒先後關系,是以同一個區中可能同時存在從Eden複制過來對象,和從前一個Survivor複制過來的對象,而複制到年老區的隻有從第一個Survivor複制過來的對象。而且,Survivor區總有一個是空的。
  2. Tenured(年老代)年老代存放從年輕代存活的對象。一般來說年老代存放的都是生命期較長的對象。
  3. Perm(持久代)用于存放靜态檔案,如今Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應用可能動态生成或者調用一些class,例如Hibernate等,在這種時候需要設定一個比較大的持久代空間來存放這些運作過程中新增的類。持久代大小通過-XX:MaxPermSize=進行設定。

GC的基本概念

gc分為full gc 跟 minor gc,當每一塊區滿的時候都會引發gc。

  1. Scavenge GC

    一般情況下,當新對象生成,并且在Eden申請空間失敗時,就觸發了Scavenge GC,堆Eden區域進行GC,清除非存活對象,并且把尚且存活的對象移動到Survivor區。然後整理Survivor的兩個區。

  2. Full GC

    對整個堆進行整理,包括Young、Tenured和Perm。Full GC比Scavenge GC要慢,是以應該盡可能減少Full GC。有如下原因可能導緻Full GC:

  • 上一次GC之後Heap的各域配置設定政策動态變化
  • System.gc()被顯示調用
  • Perm域被寫滿
  • Tenured被寫滿

記憶體溢出  out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是記憶體溢出。

記憶體洩露  memory leak,是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶體洩露危害可以忽略,但記憶體洩露堆積後果很嚴重,無論多少記憶體,遲早會被占光。其實說白了就是該記憶體空間使用完畢之後未回收。

二 Java VisualVM的其他功能

1.監視界面(cpu,類,堆,線程)

八、jdk工具之JvisualVM、JvisualVM之二--Java程式性能分析工具Java VisualVM

2.線程界面

八、jdk工具之JvisualVM、JvisualVM之二--Java程式性能分析工具Java VisualVM

3.Profile界面(性能剖析)

點選CPU按鈕執行cpu分析檢視方法

八、jdk工具之JvisualVM、JvisualVM之二--Java程式性能分析工具Java VisualVM

點選記憶體按鈕執行記憶體分析檢視類

八、jdk工具之JvisualVM、JvisualVM之二--Java程式性能分析工具Java VisualVM

4.堆dump和線程dump操作

繼續閱讀