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
安裝完成后重啟Java VisualVM,Visual GC界面自動打開,即可看到JVM中堆內存的分代情況
被監控的程序運行一段時間后Visual GC顯示如下
要看懂上面的圖必須理解Java虛擬機的一些基本概念:
堆(Heap) :JVM管理的內存叫堆
分代:根據對象的生命周期長短,把堆分為3個代:Young,Old和Permanent,根據不同代的特點采用不同的收集算法,揚長避短也。
-
Young(年輕代)
年輕代分三個區。一個Eden區,兩個Survivor區。大部分對象在Eden區中生成。當Eden區滿時,還存活的對象將被復制到Survivor區(兩個中的一個),當這個Survivor區滿時,此區的存活對象將被復制到另外一個Survivor區,當這個Survivor去也滿了的時候,從第一個Survivor區復制過來的並且此時還存活的對象,將被復制“年老區(Tenured)”。需要注意,Survivor的兩個區是對稱的,沒先后關系,所以同一個區中可能同時存在從Eden復制過來對象,和從前一個Survivor復制過來的對象,而復制到年老區的只有從第一個Survivor復制過來的對象。而且,Survivor區總有一個是空的。 -
Tenured(年老代)
年老代存放從年輕代存活的對象。一般來說年老代存放的都是生命期較長的對象。 -
Perm(持久代)
用於存放靜態文件,如今Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應用可能動態生成或者調用一些class,例如Hibernate等,在這種時候需要設置一個比較大的持久代空間來存放這些運行過程中新增的類。持久代大小通過-XX:MaxPermSize=進行設置。
GC的基本概念
gc分為full 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 VisualVM的其他功能
1.監視界面(cpu,類,堆,線程)
2.線程界面
3.Profile界面(性能剖析)
點擊CPU按鈕執行cpu分析查看方法
點擊內存按鈕執行內存分析查看類
4.堆dump和線程dump操作
Dump文件是進程的內存鏡像,可以把程序的執行狀態通過調試器保存到dump文件中,堆dump的dump文件內容如下圖所示