Java程式效能分析工具Java VisualVM(Visual GC)—程式員必備利器

來源:互聯網
上載者:User

標籤:visual gc java visualvm jvm heap dump

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

650) this.width=650;" title="捕獲.PNG" alt="wKiom1VUeQiyixcuAAMnGJdLLuU385.jpg" src="http://s3.51cto.com/wyfs02/M00/6C/E1/wKiom1VUeQiyixcuAAMnGJdLLuU385.jpg" />



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

650) this.width=650;" title="捕獲.PNG" alt="wKiom1VUfh3QOdwoAAR5bOWPUSQ180.jpg" src="http://s3.51cto.com/wyfs02/M00/6C/E1/wKiom1VUfh3QOdwoAAR5bOWPUSQ180.jpg" />



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

650) this.width=650;" title="捕獲.PNG" alt="wKiom1VUih3zWsSPAAXS4juKDgs487.jpg" src="http://s3.51cto.com/wyfs02/M02/6C/E2/wKiom1VUih3zWsSPAAXS4juKDgs487.jpg" />


要看懂上面的圖必須理解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,類,堆,線程)

650) this.width=650;" title="捕獲.PNG" alt="wKioL1VUhwezuqlHAAPtVDlu7j8689.jpg" src="http://s3.51cto.com/wyfs02/M01/6C/DD/wKioL1VUhwezuqlHAAPtVDlu7j8689.jpg" />



2.線程介面


650) this.width=650;" title="捕獲.PNG" alt="wKiom1VUhl7zciIhAAPgDckTjF8605.jpg" src="http://s3.51cto.com/wyfs02/M01/6C/E2/wKiom1VUhl7zciIhAAPgDckTjF8605.jpg" />



3.Profile介面(效能剖析)

點擊CPU按鈕執行cpu分析查看方法

650) this.width=650;" title="捕獲.PNG" alt="wKioL1VUiMHx3I-AAAUZHlSza2c463.jpg" src="http://s3.51cto.com/wyfs02/M00/6C/DD/wKioL1VUiMHx3I-AAAUZHlSza2c463.jpg" />


點擊記憶體按鈕執行記憶體分析查看類

650) this.width=650;" title="捕獲.PNG" alt="wKioL1VUimnDkaQdAAPQ9qZatVg045.jpg" src="http://s3.51cto.com/wyfs02/M01/6C/DD/wKioL1VUimnDkaQdAAPQ9qZatVg045.jpg" />



4.堆dump線程dump操作

Dump檔案是進程的記憶體鏡像,可以把程式的執行狀態通過調試器儲存到dump檔案中,堆dump的dump檔案內容如所示

650) this.width=650;" title="捕獲.PNG" alt="wKioL1VUjjeyw26xAAQawGDNDUs206.jpg" src="http://s3.51cto.com/wyfs02/M02/6C/DD/wKioL1VUjjeyw26xAAQawGDNDUs206.jpg" />


本文出自 “夢想屬於勇敢者-天行者” 部落格,請務必保留此出處http://tianxingzhe.blog.51cto.com/3390077/1651384

Java程式效能分析工具Java VisualVM(Visual GC)—程式員必備利器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.