Tomcat之Jconsole監控

Tomcat之Jconsole監控

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新建鏈接對話框,如圖所示。

Tomcat之Jconsole監控

Jconsole有兩種監控方式:本地進程監控和遠程監控。

選擇本地進程監控,在下面的列表框中會列出與JConsole程序相同用戶的進程,選擇其中一個進程,單擊連接按鈕,即可以進行監控的主界面。

選擇遠程監控,需要的內容包括。主機名和JMX代理的端口號,以及訪問服務器的用戶名和密碼。

當連接成功後,會彈出監控界面,如圖所示。

Tomcat之Jconsole監控

監控的內容主要包括六個方面的內容:概述、內存、線程、類、VM摘要和MBean。

概要信息

概要信息監控界面主要包括堆內存使用情況、線程數、Java VM中加載類和CPU使用情況。選中各視圖可以切換監控的時間片段,同時也可以將視圖中的數據保存在一個逗號分隔(CSV)文件中。

內存信息

內存監控信息主要提供了內存消耗和內存池的信息,如圖所示。

Tomcat之Jconsole監控

內存監控信息主要監控了兩類內存消耗的信息:堆和非堆內存,這兩種內存也是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往往會很慢,因為它涉及到所有存活的對象,永久代包含虛擬機所有本身數據的反射,如類和方法。

如果垃圾收集器出現瓶頸,那麼可以通過自定義代大小來提高性能。

線程信息

線程的監控信息如圖所示。

Tomcat之Jconsole監控

在左下角“線程”列表中顯示了所有活動的線程,如果需要查找指定的線程,可以在“過濾器”字段中輸入待查找的線程,選中某個線程,右邊文本框即會顯示出當前線程的名稱、狀態和堆棧跟蹤信息。

上面的線程數目視圖中動態的顯示當前活動線程數,主要包括兩部分內容:當前活動線程數和峰值線程數。

線程監控視圖中還提供了一個檢測死鎖線程的功能,單擊【檢測到死鎖】按鈕,如果存在任何線程對象監視器出現死鎖情況,則會顯示出該死鎖線程的ID號,並且會顯示出當前線程的相關信息。

在MBean選項卡中可以監視Java虛擬機線程信息的所有屬性和操作。

類信息

類的監控信息如圖所示。

Tomcat之Jconsole監控

已裝入類的數目視圖中顯示了已裝入類的總數和當前加載的類,其實紅色表示已裝入類的總數,藍線當前加載的類。詳細信息中顯示了當前已裝入的類、已裝入類的總數和已卸載類的總數。

VM摘要信息

VM摘要的監控信息如圖所示。

Tomcat之Jconsole監控

在VM摘要信息中主要包括五方面的信息:摘要信息、線程和類信息、內存信息、操作系統信息和其它信息。

摘要部分的信息主要包括以下信息:

Ø 連接名稱:連接監控時的進程PID信息;

Ø 運行時間:開始以來Java虛擬機運行的時間總額;

Ø 處理CPU時間:Java VM的開始,消耗的CPU時間總量;

Ø 編譯總時間:累計時間花費在JIT編譯所花費的時間;

線程和類信息主要包括以下信息:

Ø 活動線程:當前活動的線程;

Ø 峰值:最大線程數;

Ø 守護線程:即運行在後臺的線程;

Ø 已啟動的線程總數:運行到目前為止共啟動的線程數;

Ø 當前類已裝入:當前正在運行過程中已裝載類的總數;

Ø 已裝入類的總數:運行到目前為止所裝載類的總數;

Ø 已卸載類的總數:運行到目前為止已卸載類的總數;

內存信息主要包括以下信息:

Ø 當前堆大小:當前堆分配的內存空間;

Ø 分配的內存:當前已分配的內存大小;

Ø 堆大小的最大值:堆分配內存的最大值;

Ø 暫掛結束操作:當前暫時掛起結束的對象;

Ø 垃圾收集器:垃圾收集器描述了收集器的名稱、收集器收集的內存數量和收集這些內存所消費的時間;

操作系統信息主要包括操作系統名、體系結構、分配的虛擬內存、物理內存總量、可用物理內存、交換空間總量和可用交換空間。

其它信息主要包括以下信息:

Ø VM參數:顯示通過應用程序傳送給Java虛擬機的參數,這些參數不包括的主要方法的參數;

Ø 類路徑:由系統類加載器用於搜索類文件的類路徑;

Ø 庫路徑:加載庫時要搜索的路徑列表;

Ø 引導類路徑:引導類加載器搜索類文件的路徑列表;

MBean信息

MBeans選項卡顯示MBean服務器所註冊的MBeans的類,MBeans選項卡允許訪問平臺MXBean服務器,此外,還可以監控和管理應用程序的MBean,MBean信息如圖所示。

Tomcat之Jconsole監控

左側顯示了當前所以運行的MBean,當選中MBean樹中某個MBean時,右側會顯示當前被選中MBean的MBeanInfo和描述符信息,在下面會顯示當前MBean的相關屬性、操作和通知信息。

MBean屬性

在MBean樹中選擇一個MBean,單擊“屬性”節點,將顯示MBean的所有屬性,以Memory為例,如圖所示。

Tomcat之Jconsole監控

選中屬性下面的單個屬性,在右側會顯示出當前屬性的詳細信息,如圖所示。

Tomcat之Jconsole監控

單擊屬性值(即右側黑體字),可以展開詳細的屬性值信息, HeapMemoryUsage屬性展開後的值,如圖所示。

Tomcat之Jconsole監控

雙擊屬性值,可以對這些顯示的值進行修改,有的屬性是以圖表的方式顯示,如圖顯示的是Threading中的CurrentThreadUserTime屬性值。

Tomcat之Jconsole監控

Mbean操作

在MBean樹中選擇一個MBean,單擊“操作”節點,將顯示MBean的所有相關操作,以Threading為例,如圖所示。

Tomcat之Jconsole監控

單擊操作調用中的按鈕,可以調用這些方法,單擊某種方法可以顯示當前方法的詳細信息,如圖所示。

Tomcat之Jconsole監控

Mbean通知

在MBean樹中選擇一個MBean,單擊“通知”節點,選擇某個通知,右側將顯示該通知的詳細信息,以Memory為例,如圖所示。

Tomcat之Jconsole監控


分享到:


相關文章: