八、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命令之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

技術分享

 

打開Java VisualVM檢查更新插件時,默認的連接連不上,通過瀏覽器訪問之后發現默認的服務器已經404,新地址已經遷移到github,下面這個地址里面有不同版本jdk對應的插件中心地址。 
https://visualvm.github.io/pluginscenters.html

我從上面的鏈接中找到Visual GC的下載地址:

下載下來是一個com-sun-tools-visualvm-modules-visualgc.nbm文件,然后添加安裝它

 

 

安裝完成后重啟Java VisualVM,Visual GC界面自動打開,即可看到JVM中堆內存的分代情況

技術分享

 

 

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

技術分享

 

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

技術分享

 

 

2.線程界面

 

技術分享

 

 

3.Profile界面(性能剖析)

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

 

技術分享

 

點擊內存按鈕執行內存分析查看類

技術分享

 

 

4.堆dump線程dump操作

Dump文件是進程的內存鏡像,可以把程序的執行狀態通過調試器保存到dump文件中,堆dump的dump文件內容如下圖所示

技術分享

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM