JConsole的圖形用戶界面是一個符合Java管理擴展(JMX)規範的監測工具,JConsole使用Java虛擬機(Java VM),提供在Java平臺上運行的應用程序的性能和資源消耗的信息。在Java平臺,標準版(Java SE平臺)6,JConsole的已經更新到目前的外觀,類似於Windows和GNOME桌面(其他平臺,將目前標準的Java圖形的外觀和感覺),在這個文件中提出的屏幕截圖是從Windows XP上運行的接口的一個實例。
Jconsole是一個可執行文件,在Java根目錄下有一個bin文件,該文件下可以找到jconsole文件,單擊可直接運行該程序,如果將該jconsole的路徑設置為環境變量,那麼可以直接在開始菜單運行命令中直接鍵jconsole命令,來運行jconsole程序,如果未設置為環境變量,那麼則需要寫全路徑。
啟動JConsole程序的方式有兩種:一種是帶參數的啟動;另外一種是不帶參數啟動。
帶參數啟動JConsole啟動時,又分有兩種情況:一種是監控本地進和;另一種是遠程監控;
本地監控的命令格式如下:
JConsole processID
processID是指應用程序的進程ID(PID),可以使用以下方式確定一個應用程序的PID:
Ø 在UNIX或Linux系統,可以使用 ps命令找到正在運行的Java實例的PID;
Ø 在Windows系統上,可以使用任務管理器,找到java或者javaw進程的PID;
例如:如果監控JConsole程序,JConsole的進程號為5604,那麼可以用下面的命令啟動JConsole:
JConsole 5604
遠程監控的命令格式如下:
JConsole 主機名:portNum
主機名是需要監聽的主機,portNum是啟動Java虛擬機時指定的JMX代理的端口號。
注意:使用JConsole監視本地應用程序在開發和創建原型是非常有用的,但不推薦用於生產環境,因為Jconsole本身也消耗大量的系統資源。
執行Jconsole程序時,不帶任何參數命令,會彈出Jconsole新建鏈接對話框,如圖所示。
Jconsole有兩種監控方式:本地進程監控和遠程監控。
選擇本地進程監控,在下面的列表框中會列出與JConsole程序相同用戶的進程,選擇其中一個進程,單擊連接按鈕,即可以進行監控的主界面。
選擇遠程監控,需要的內容包括。主機名和JMX代理的端口號,以及訪問服務器的用戶名和密碼。
當連接成功後,會彈出監控界面,如圖所示。
監控的內容主要包括六個方面的內容:概述、內存、線程、類、VM摘要和MBean。
概要信息
概要信息監控界面主要包括堆內存使用情況、線程數、Java VM中加載類和CPU使用情況。選中各視圖可以切換監控的時間片段,同時也可以將視圖中的數據保存在一個逗號分隔(CSV)文件中。
內存信息
內存監控信息主要提供了內存消耗和內存池的信息,如圖所示。
內存監控信息主要監控了兩類內存消耗的信息:堆和非堆內存,這兩種內存也是Java虛擬機管理的兩種內存,這兩者都是Java虛擬機啟動時創建的。
Ø 堆內存是運行時數據區域,Java VM的所有類實例和數組分配內存,可能是固定或可變大小的堆。
Ø 非堆內存包括在所有線程和Java虛擬機內部處理或優化所需的共享的方法。它存儲了類的結構、運行常量池、字段和方法數據,以及方法和構造函數的代碼,方法區在邏輯上是堆的一部分,看具體實現的方式。根據實現方式的不同,Java虛擬機可能不進行垃圾收集或壓縮。與堆內存一樣,方法區域可能是一個固定或可變大小,方法區的內存不需要是連續的。
除了方法區,Java虛擬機可能需要進行內部處理或優化,這也屬於非堆內存的內存。例如,實時(JIT)編譯器需要內存用於存儲從Java虛擬機的高性能的代碼翻譯的機器碼。
Jconsole提供的監控的堆和非堆的內存主要包括以下幾類:
Ø Eden Space內存池:大多數對象初始化時分配的內存池;
Ø Survivor Space內存池:這個內存池包含的對象是回收Eden Space內存池後所幸存的對象;
Ø Tenured Gen內存池:這個內存池包含的對象是在Survivor Space內存池中已經存在一段時間的對象;
Ø Code Cache內存池:包括HotSpot Java VM的代碼緩存和編譯、存儲代碼所消耗的內存;
Ø Perm Gen[shared-rw]內存池:Perm Gen內存池中讀寫的區域;
Ø Perm Gen[shared-ro]內存池:Perm Gen內存池中只讀的區域;
Ø Perm Gen內存池:該內存池包括虛擬機本身反射的數據,如類和方法,Java虛擬機在運行時會共享這些類數據區域,共享的區域有隻讀和讀寫兩種方式。
在圖表下拉列表框中可以選擇不同內存池進行監控,並獲得當前內存池所消耗的內存信息,此外右下角顯示了堆和非堆的圖標,切換顯示的圖表,內存池圖表顯示的內容也隨著切換,如果顯示為紅色,那說明使用的內存超過內存的閥值。
內存池和內存管理器是Java虛擬機的內存系統的關鍵環節。
Ø 一個內存池表示Java虛擬機管理的內存區域。Java虛擬機至少有一個內存池,它可能在執行過程中創建或刪除內存池,一個內存池可以屬於堆或非堆內存。
Ø 一個內存管理器管理一個或多個內存池,垃圾收集器是一個負責回收不可達的對象使用內存的內存管理器,Java虛擬機可能有一個或更多的內存管理器,在執行過程中,它可以添加或刪除內存管理器,一個內存池可以由一個以上的內存管理器進行管理。
“詳細信息”框中顯示了內存使用的詳細信息,主要包括以下信息:
已使用:當前使用的內存數,包括已經使用的、可獲得或未獲得的內存;
分配:分配的內存必須保證Java虛擬機所需要的使用量,提交的內存可能會隨時間的改變而改變,Java虛擬機可能會釋放系統內存,分配的內存可能會少於最初啟動時分配的內存量,分配的內存大於或等於需要使用的內存量。
最大值:內存管理中可用的最大內存,該值是變化的或不確定的,如果Java虛擬機使用的內存在不斷的增長並且大於所分配的內存量,那麼分配內存將失敗。
GC時間:累積垃圾收集的時間和總調用的時間,它可能包含多行,其中每行代表一個垃圾收集器算法在Java虛擬機中所消耗的時間。
垃圾收集(GC Garbage Collect)是Java虛擬機如何釋放不再被引用的對象所佔用的內存的機制,它通常認為的對象,有當前活動的“活著”的對象和無法引用或不獲得“死”對象,垃圾收集是由釋放“死”對象所佔用內存的過程,垃圾收集的算法和參數對性能有很大的影響。
Java HotSpot虛擬機的垃圾收集器使用代GC,代GC的優勢大多數都符合以下的概括:
Ø 它們創建一些短暫一生的對象,如迭代和局部變量;
Ø 它們創建一些長生命的對象,如高層次的持久對象;
代GC分為幾代,並給每個指定一個或多個內存池,當一代使用了分配的內存,虛擬機上執行一個局部的GC(也叫minor collection),內存池回收死對象使用的內存,這部分的GC速度通常遠遠優於一個完整的GC。
Java HotSpot虛擬機定義了兩代:年輕代(有時也被稱為“託兒所”)和年老代,年輕代包括一個“Eden space”和兩個“survivor spaces”,最初,VM將所有的對象在“Eden space”內存池中,並且大多數對象“死”在那裡,當它執行了一次局部GC(minor GC),VM將剩餘的對象從“Eden space”轉移到“survivor spaces”,虛擬長生存時間的對象移動到年老代的“tenured”空間,當年老代填滿了,將是一個完整的GC,一個完整的GC往往會很慢,因為它涉及到所有存活的對象,永久代包含虛擬機所有本身數據的反射,如類和方法。
如果垃圾收集器出現瓶頸,那麼可以通過自定義代大小來提高性能。
線程信息
線程的監控信息如圖所示。
在左下角“線程”列表中顯示了所有活動的線程,如果需要查找指定的線程,可以在“過濾器”字段中輸入待查找的線程,選中某個線程,右邊文本框即會顯示出當前線程的名稱、狀態和堆棧跟蹤信息。
上面的線程數目視圖中動態的顯示當前活動線程數,主要包括兩部分內容:當前活動線程數和峰值線程數。
線程監控視圖中還提供了一個檢測死鎖線程的功能,單擊【檢測到死鎖】按鈕,如果存在任何線程對象監視器出現死鎖情況,則會顯示出該死鎖線程的ID號,並且會顯示出當前線程的相關信息。
在MBean選項卡中可以監視Java虛擬機線程信息的所有屬性和操作。
類信息
類的監控信息如圖所示。
已裝入類的數目視圖中顯示了已裝入類的總數和當前加載的類,其實紅色表示已裝入類的總數,藍線當前加載的類。詳細信息中顯示了當前已裝入的類、已裝入類的總數和已卸載類的總數。
VM摘要信息
VM摘要的監控信息如圖所示。
在VM摘要信息中主要包括五方面的信息:摘要信息、線程和類信息、內存信息、操作系統信息和其它信息。
摘要部分的信息主要包括以下信息:
Ø 連接名稱:連接監控時的進程PID信息;
Ø 運行時間:開始以來Java虛擬機運行的時間總額;
Ø 處理CPU時間:Java VM的開始,消耗的CPU時間總量;
Ø 編譯總時間:累計時間花費在JIT編譯所花費的時間;
線程和類信息主要包括以下信息:
Ø 活動線程:當前活動的線程;
Ø 峰值:最大線程數;
Ø 守護線程:即運行在後臺的線程;
Ø 已啟動的線程總數:運行到目前為止共啟動的線程數;
Ø 當前類已裝入:當前正在運行過程中已裝載類的總數;
Ø 已裝入類的總數:運行到目前為止所裝載類的總數;
Ø 已卸載類的總數:運行到目前為止已卸載類的總數;
內存信息主要包括以下信息:
Ø 當前堆大小:當前堆分配的內存空間;
Ø 分配的內存:當前已分配的內存大小;
Ø 堆大小的最大值:堆分配內存的最大值;
Ø 暫掛結束操作:當前暫時掛起結束的對象;
Ø 垃圾收集器:垃圾收集器描述了收集器的名稱、收集器收集的內存數量和收集這些內存所消費的時間;
操作系統信息主要包括操作系統名、體系結構、分配的虛擬內存、物理內存總量、可用物理內存、交換空間總量和可用交換空間。
其它信息主要包括以下信息:
Ø VM參數:顯示通過應用程序傳送給Java虛擬機的參數,這些參數不包括的主要方法的參數;
Ø 類路徑:由系統類加載器用於搜索類文件的類路徑;
Ø 庫路徑:加載庫時要搜索的路徑列表;
Ø 引導類路徑:引導類加載器搜索類文件的路徑列表;
MBean信息
MBeans選項卡顯示MBean服務器所註冊的MBeans的類,MBeans選項卡允許訪問平臺MXBean服務器,此外,還可以監控和管理應用程序的MBean,MBean信息如圖所示。
左側顯示了當前所以運行的MBean,當選中MBean樹中某個MBean時,右側會顯示當前被選中MBean的MBeanInfo和描述符信息,在下面會顯示當前MBean的相關屬性、操作和通知信息。
MBean屬性
在MBean樹中選擇一個MBean,單擊“屬性”節點,將顯示MBean的所有屬性,以Memory為例,如圖所示。
選中屬性下面的單個屬性,在右側會顯示出當前屬性的詳細信息,如圖所示。
單擊屬性值(即右側黑體字),可以展開詳細的屬性值信息, HeapMemoryUsage屬性展開後的值,如圖所示。
雙擊屬性值,可以對這些顯示的值進行修改,有的屬性是以圖表的方式顯示,如圖顯示的是Threading中的CurrentThreadUserTime屬性值。
Mbean操作
在MBean樹中選擇一個MBean,單擊“操作”節點,將顯示MBean的所有相關操作,以Threading為例,如圖所示。
單擊操作調用中的按鈕,可以調用這些方法,單擊某種方法可以顯示當前方法的詳細信息,如圖所示。
Mbean通知
在MBean樹中選擇一個MBean,單擊“通知”節點,選擇某個通知,右側將顯示該通知的詳細信息,以Memory為例,如圖所示。
閱讀更多 川石信息 的文章