VisualVM 是一款免費的\集成了多個JDK 命令行工具的可視化工具,它能爲您提供強大的分析能力,對 Java 應用程序作性能分析和調優。這些功能包括生成和分析海量數據、跟蹤內存泄漏、監控垃圾回收器、執行內存和 CPU 分析,同時它還支持在 MBeans 上進行瀏覽和操做。html
在內存分析上,Java VisualVM的最大好處是可經過安裝Visual GC插件來分析GC(Gabage Collection)趨勢、內存消耗詳細情況。java
一 Visual GC(監控垃圾回收器)
算法
Java VisualVM默認沒有安裝Visual GC插件,須要手動安裝,JDK的安裝目錄的bin目露下雙擊jvisualvm.exe,便可打開Java VisualVM,點擊菜單欄 工具->插件 安裝Visual GCjvm
安裝完成後重啓Java VisualVM,Visual GC界面自動打開,便可看到JVM中堆內存的分代狀況ide
被監控的程序運行一段時間後Visual GC顯示以下工具
要看懂上面的圖必須理解Java虛擬機的一些基本概念:性能
堆(Heap) :JVM管理的內存叫堆spa
分代:根據對象的生命週期長短,把堆分爲3個代:Young,Old和Permanent,根據不一樣代的特色採用不一樣的收集算法,揚長避短也。插件
Young(年輕代)
年輕代分三個區。一個Eden區,兩個Survivor區。大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被複制到Survivor區(兩個中的一個),當這個Survivor區滿時,此區的存活對象將被複制到另一個Survivor區,當這個Survivor區也滿了的時候,從第一個Survivor區複製過來的而且此時還存活的對象,將被複制「年老區(Tenured)」。須要注意,Survivor的兩個區是對稱的,沒前後關係,因此同一個區中可能同時存在從Eden複製過來對象,和從前一個Survivor複製過來的對象,而複製到年老區的只有從第一個Survivor複製過來的對象。並且,Survivor區總有一個是空的。參考文章:http://www.iteye.com/topic/894148命令行
Tenured(年老代)
年老代存放從年輕代存活的對象。通常來講年老代存放的都是生命期較長的對象。
Perm(持久代)
用於存放靜態文件,現在Java類、方法等。持久代對垃圾回收沒有顯著影響,可是有些應用可能動態生成或者調用一些class,例如Hibernate等,在這種時候須要設置一個比較大的持久代空間來存放這些運行過程當中新增的類。持久代大小經過-XX:MaxPermSize=進行設置。
GC的基本概念
gc分爲full gc 跟 minor gc(Young GC也就是Minor GC),當每一塊區滿的時候都會引起gc。
Scavenge GC
通常狀況下,當新對象生成,而且在Eden申請空間失敗時,就觸發了Scavenge GC,堆Eden區域進行GC,清除非存活對象,而且把尚且存活的對象移動到Survivor區。而後整理Survivor的兩個區。
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內存狀況命令(jstat)
jmap -heap [pid] 查看內存分佈
jstat -gcutil [pid] 1000 每隔1s輸出java進程的gc狀況
http://boendev.iteye.com/blog/882479
http://www.cnblogs.com/ggjucheng/p/3977384.html
http://www.searchtb.com/2013/07/jvm-gc-introduction-examples.html
二 Java VisualVM的其餘功能
1.監視界面(cpu,類,堆,線程)
2.線程界面
VisualVM 的線程標籤提供了三種視圖,默認會以時間線的方式展示。另外兩種視圖分別是表視圖和詳細信息視圖。
時間線視圖上方的工具欄提供了縮小,放大和自適應三個按鈕,以及一個下拉框,咱們能夠選擇將全部線程、活動線程或者完成的線程顯示在視圖中。
3.Profile界面(性能剖析)
在 Profiler 標籤,點擊「CPU」按鈕啓動一個 CPU 性能分析會話 ,VisualVM 會檢測應用程序全部的被調用的方法。當進入一個方法時,線程會發出一個「method entry」的事件,當退出方法時一樣會發出一個「method exit」的事件,這些事件都包含了時間戳。而後 VisualVM 會把每一個被調用方法的總的執行時間和調用的次數按照運行時長展現出來。
此外,咱們也能夠經過性能分析結果下方的方法名過濾器對分析結果進行過濾。
點擊內存按鈕執行內存分析查看類
咱們可使用 VisualVM 的快照功能生成任意個性能分析快照並保存到本地來輔助咱們進行性能分析。快照爲捕獲應用程序性能分析數據提供了一個很便捷的方式由於快照一旦生成能夠在任什麼時候候離線打開和查看,也能夠相互傳閱。
VisualVM 提供了兩種類型的快照:
Profiler 快照:當有一個性能分析會話(內存或者 CPU)正在進行時,咱們能夠經過性能分析結果工具欄的「快照」按鈕生成 Profiler 快照捕獲當時的性能分析數據。
應用程序快照:咱們能夠右鍵點擊左側 Applications 窗口中應用程序節點,選擇「應用程序快照」爲生成一個應用程序快照。應用程序快照會收集某一時刻的堆轉儲,線程轉儲和 Profiler 快照,同時也會捕獲 JVM 的一些基本信息。
5.堆dump(轉儲)和線程dump(轉儲)操做
線程轉儲的生成與分析
VisualVM 可以對正在運行的本地應用程序生成線程轉儲,把活動線程的堆棧蹤影打印出來,幫助咱們有效瞭解線程運行的狀況,診斷死鎖、應用程序癱瘓等問題。
VisualVM 可以生成堆轉儲,統計某一特定時刻 JVM 中的對象信息,幫助咱們分析對象的引用關係、是否有內存泄漏狀況的發生等。
Dump文件是進程的內存鏡像,能夠把程序的執行狀態經過調試器保存到dump文件中,堆dump的dump文件內容以下圖所示
當 VisualVM 統計完堆內對象數據後,會把堆轉儲信息顯示在新的堆轉儲標籤內,咱們能夠看到摘要、類、實例數等信息以及經過 OQL 【對象查詢語言是專門爲ODMG(Object Database Management Group)對象模型制定的查詢語言】控制檯執行查詢語句功能。
堆轉儲的摘要包括轉儲的文件大小、路徑等基本信息,運行的系統環境信息,也能夠顯示全部的線程信息
從類視圖能夠得到各個類的實例數和佔用堆大小數,分析出內存空間的使用狀況,找出內存的瓶頸,避免內存的過分使用。
經過實例數視圖能夠得到每一個實例內部各成員變量的值以及該實例被引用的位置。首先須要在類視圖選擇須要查看實例的類。
此外,還能對兩個堆轉儲文件進行比較。經過比較咱們可以分析出兩個時間點哪些對象被大量建立或銷燬。
線程轉儲和堆轉儲都可以另存成文件,以便進行離線分析。
詳細講解:
http://www.ibm.com/developerworks/cn/java/j-lo-visualvm/