VisualVM介绍使用
1 ? ?打開VisualVM(這個工具放在JDK安裝目錄的bin目錄下,雙擊jvisualvm.exe即可打開),如下圖所示
?
? 以VisualVM自身為例,VisualVM本身也是一個java程序,當(dāng)然也而已用VisualVM來分析
2???概述頁面主要顯示程序的啟動參數(shù)和系統(tǒng)信息(如下圖所示)?? ? ? ? ? ?
?
- JVM參數(shù)?-- VisualVm?啟動時候設(shè)置的JVM參數(shù)
- ?系統(tǒng)屬性?-- java環(huán)境的系統(tǒng)參數(shù)
3????監(jiān)視頁面主要展示?系統(tǒng)資源占用情況(如下圖所示)
?
- ? 執(zhí)行垃圾回收?--?手動觸發(fā)一次GC?相當(dāng)于在程序代碼中調(diào)用(System.gc()),如果是遠(yuǎn)程連接到生產(chǎn)環(huán)境中請慎重點擊。
- ? 堆Dump --?生產(chǎn)當(dāng)前程序的內(nèi)存快照hprof文件,對于分析內(nèi)存溢出問題比較有幫助。(可以查看當(dāng)前程序內(nèi)存中的所有對象)
4????線程頁面(主要展示程序中所有的線程運(yùn)行狀態(tài))
5????抽樣器(應(yīng)該算是線程頁面功能的一個補(bǔ)充)
CPU-> CPU樣例?–?主要展示方法消耗的CPU資源比例和時間
?
?
CPU->線程CPU時間?–?主要展示線程消耗的CPU資源信息
?
內(nèi)存->?堆柱狀圖?–?展示堆內(nèi)存中各種對象占用的字節(jié)數(shù)和總實例數(shù)
?
?
內(nèi)存->PermGen –?展示方法區(qū)各種對象消耗的內(nèi)存情況
?
內(nèi)存->?每個線程分配—展示不同線程占用內(nèi)存的情況
?
6????增加VisualGC插件
Java VisualVM默認(rèn)沒有安裝Visual GC插件,需要手動安裝,JDK的安裝目錄的bin目露下雙擊jvisualvm.exe,即可打開Java VisualVM,點擊菜單欄?工具->插件?安裝Visual GC
?
?
安裝完成后重啟Java VisualVM,Visual GC界面自動打開,即可看到JVM中堆內(nèi)存的分代情況
?
?
被監(jiān)控的程序運(yùn)行一段時間后Visual GC顯示如下
?
要看懂上面的圖必須理解Java虛擬機(jī)的一些基本概念:
堆(Heap)?:JVM管理的內(nèi)存叫堆
分代:根據(jù)對象的生命周期長短,把堆分為3個代:Young,Old和Permanent,根據(jù)不同代的特點采用不同的收集算法,揚(yáng)長避短也。
Young(年輕代)
年輕代分三個區(qū)。一個Eden區(qū),兩個Survivor區(qū)。大部分對象在Eden區(qū)中生成。當(dāng)Eden區(qū)滿時,還存活的對象將被復(fù)制到Survivor區(qū)(兩個中的一個),當(dāng)這個Survivor區(qū)滿時,此區(qū)的存活對象將被復(fù)制到另外一個Survivor區(qū),當(dāng)這個Survivor去也滿了的時候,從第一個Survivor區(qū)復(fù)制過來的并且此時還存活的對象,將被復(fù)制“年老區(qū)(Tenured)”。需要注意,Survivor的兩個區(qū)是對稱的,沒先后關(guān)系,所以同一個區(qū)中可能同時存在從Eden復(fù)制過來對象,和從前一個Survivor復(fù)制過來的對象,而復(fù)制到年老區(qū)的只有從第一個Survivor復(fù)制過來的對象。而且,Survivor區(qū)總有一個是空的。
Tenured(年老代)
年老代存放從年輕代存活的對象。一般來說年老代存放的都是生命期較長的對象。
Perm(持久代)
用于存放靜態(tài)文件,如今Java類、方法等。持久代對垃圾回收沒有顯著影響,但是有些應(yīng)用可能動態(tài)生成或者調(diào)用一些class,例如Hibernate等,在這種時候需要設(shè)置一個比較大的持久代空間來存放這些運(yùn)行過程中新增的類。持久代大小通過-XX:MaxPermSize=進(jìn)行設(shè)置。
?
GC的基本概念
gc分為full gc 跟 minor gc,當(dāng)每一塊區(qū)滿的時候都會引發(fā)gc。
Scavenge GC
一般情況下,當(dāng)新對象生成,并且在Eden申請空間失敗時,就觸發(fā)了Scavenge GC,堆Eden區(qū)域進(jìn)行GC,清除非存活對象,并且把尚且存活的對象移動到Survivor區(qū)。然后整理Survivor的兩個區(qū)。
Full GC
對整個堆進(jìn)行整理,包括Young、Tenured和Perm。Full GC比Scavenge GC要慢,因此應(yīng)該盡可能減少Full GC。有如下原因可能導(dǎo)致Full GC:
-
上一次GC之后Heap的各域分配策略動態(tài)變化
-
System.gc()被顯示調(diào)用
-
Perm域被寫滿
-
Tenured被寫滿
?
內(nèi)存溢出??out of memory,是指程序在申請內(nèi)存時,沒有足夠的內(nèi)存空間供其使用,出現(xiàn)out of memory;比如申請了一個integer,但給它存了long才能存下的數(shù),那就是內(nèi)存溢出。
內(nèi)存泄露? memory leak,是指程序在申請內(nèi)存后,無法釋放已申請的內(nèi)存空間,一次內(nèi)存泄露危害可以忽略,但內(nèi)存泄露堆積后果很嚴(yán)重,無論多少內(nèi)存,遲早會被占光。其實說白了就是該內(nèi)存空間使用完畢之后未回收。
?
轉(zhuǎn)載于:https://www.cnblogs.com/lizhen-home/p/7727536.html
總結(jié)
以上是生活随笔為你收集整理的VisualVM介绍使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT信号和槽函数学习笔记
- 下一篇: 【USACO2006 Mar】滑雪缆车