JConsole是從Java 5中開始引入的一個用於對JVM性能和資源消耗進行監控的圖形化工具。
JConsole能夠鏈接本地的Java程序,也能夠鏈接遠程的Java程序。因爲是GUI的方式使用,因此就不細說那些基本的使用方法了,這裏只是記錄一下試用過程當中遇到的幾個小問題及其解決方案。html
1. 要實現讓JConsole能夠遠程鏈接到某個Java程序,則須要在Java程序啓動的JAVA_OPTION中添加選項「com.sun.management.jmxremote.port=8888」來指定遠程管理的端口。java
2. 啓動Java程序時,遇到以下報錯:算法
Thu Jul 25 23:00:50 CST 2013 ./jbb.jar:./check.jar: java full version "1.6.0_24-b24" Error: Password file not found: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/management/jmxremote.password Thu Jul 25 23:00:50 CST 2013
這是因爲開啓Java JMX 遠程管理時,默認會有用戶名密碼的驗證,因此須要相應的密碼文件。shell
[root@localhost SPECjbb2005]# ls /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/management/ jmxremote.access jmxremote.password.template management.properties snmp.acl.template
須要先在jmxremote.access中定義用戶權限,而後在jmxremote.password文件中定義用戶名和對應的密碼,jmxremote.password文件能夠複製jmxremote.password.template模板文件來進行修改。
固然,在內網中僅僅用於調試,咱們通常能夠不設置密碼驗證和SSL鏈接方式,Java選項以下:
-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false數組
報錯:緩存
Error: Password file read access must be restricted: /usr/java/jdk1.8.0_60/jre/lib/management/jmxremote.password
在配置JMX遠程訪問的時候,設置jmxremote.password文件權限,修改該文件時添加寫權限,chmod +w jmxremote.password ,放開角色信息那倆行的註釋,保存,再使用chmod 0400 jmxremote.password服務器
這樣就是它正確的權限設置oracle
jmxremote.password 在jdk/jre/lib/management/下,jmxremote.password.template複製,去掉.template後綴jvm
3. 在進行了端口和認證信息的配置後,發如今JConsole中經過IP遠程鏈接JVM依然不成功。
錯誤信息爲:Connection Failed: Retry? The connection to 192.168.52.11:8888 did not succeed. Would you like to try again?
在啓動Java時,須要設置RMI遠程調用的主機名,通常設置爲主機的IP地址便可,以下:
-Djava.rmi.server.hostname=192.168.52.11
(固然,也有多是因爲前面第2點中提到的SSL的設置問題,依然須要檢查一下)ide
關於JConsole,仍是得執行看看Oracle的這篇Java SE 6 中的JConsole的描述:
http://docs.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html
(特別是上面文檔中對監控數據、圖形表明的意義是須要認真理解的)
JConsole圖形用戶界面是符合Java Management Extensions(JMX)規範的監視工具。JConsole使用Java虛擬機(Java VM)的大量工具來提供有關在Java平臺上運行的應用程序的性能和資源消耗的信息。
在Java平臺標準版(Java SE平臺)6中,JConsole已更新,以呈現Windows和GNOME桌面的外觀(其餘平臺將呈現標準的Java圖形外觀)。本文檔中提供的屏幕截圖取自在Windows XP上運行的界面實例。
jconsole可執行文件能夠在JDK_HOME / bin中找到,其中JDK_HOME是Java開發工具包(JDK)的安裝目錄。若是此目錄位於系統路徑中,則只需在命令(shell)提示符下鍵入jconsole便可啓動JConsole。不然,您必須輸入可執行文件的完整路徑。
您可使用JConsole監視本地應用程序,即與JConsole在同一系統上運行的應用程序,以及遠程應用程序,即在其餘系統上運行的應用程序。
注 - 使用JConsole監視本地應用程序對於開發和建立原型很是有用,但不建議在生產環境中使用,由於JConsole自己會消耗大量的系統資源。建議使用遠程監控將JConsole應用程序與正在監控的平臺隔離。
有關jconsole命令的語法的完整參考,請參閱jconsole命令的手冊頁:Java監視和管理控制檯。 Java Monitoring and Management Console.
要啓動JConsole進行遠程監視,請使用如下命令語法:
% jconsole hostName:portNum
在上面的命令中,hostName是運行應用程序的系統的名稱,portNum是您在啓動Java VM時啓用JMX代理時指定的端口號。有關更多信息,請參閱遠程監視和管理。
若是您未指定主機名/端口號組合,則JConsole將顯示鏈接對話框(鏈接到JMX代理),以便您輸入主機名和端口號。
「Overview」(概覽)選項卡顯示關於CPU使用狀況,內存使用狀況,線程數量以及Java VM中加載的類的圖形化監視信息,全部這些都在一個屏幕中顯示。
「概覽」選項卡提供了一種簡單的方法,能夠關聯以前僅經過在多個選項卡之間切換纔可用的信息。
JConsole容許您將圖表中顯示的數據保存爲逗號分隔值(CSV)文件。要保存圖表中的數據,只需右鍵單擊任意圖表,選擇保存數據爲...,而後指定將保存數據的文件。您能夠經過這種方式保存JConsole不一樣選項卡中顯示的任何圖表中的數據。
CSV格式一般用於電子表格應用程序之間的數據交換。CSV文件能夠導入到電子表格應用程序中,並可用於在這些應用程序中建立圖表。數據以兩個或多個命名列顯示,其中第一列表明時間戳。將文件導入電子表格應用程序後,一般須要選擇第一列,並根據須要將其格式更改成「日期」或「日期/時間」。
「內存」選項卡提供有關內存消耗和內存池的信息。
「內存」選項卡具備「執行GC」按鈕,您能夠隨時單擊執行垃圾回收。該圖表顯示了隨時間變化的Java VM的內存使用狀況,堆內存和非堆內存以及特定內存池的使用狀況。可用的內存池取決於正在使用哪一個版本的Java VM。對於HotSpot Java VM,用於串行垃圾收集的內存池以下所示:
Eden Space (heap): 內存最初分配給大多數對象的池。
Survivor Space (heap): 包含在伊甸園空間的垃圾收集中存活的對象的池。
Tenured Generation(heap):包含已經存在一段時間的倖存者空間中的對象的池。
Permanent Generation (non-heap):包含虛擬機自己的全部反射數據(例如類和方法對象)的池。使用類數據共享的Java虛擬機,這一代分爲只讀和讀寫區域。
Code Cache (non-heap): HotSpot Java VM還包含代碼緩存,其中包含用於編譯和存儲本機代碼的內存。
您能夠經過選擇「圖表」下拉菜單中的選項來顯示不一樣的圖表,以繪製這些內存池的消耗狀況。此外,單擊右下角的堆或非堆圖條會切換顯示的圖表。最後,您能夠經過從「時間範圍」下拉菜單中的選項中進行選擇來指定跟蹤內存使用狀況的時間範圍。
有關這些內存池的更多信息,請參閱下面的垃圾收集。
「詳細信息」區域顯示多個當前內存指標:
Used:當前使用的內存量,包括全部對象佔用的內存,可達到和不可達。
Committed:保證可供Java VM使用的內存量。提交的內存量可能隨時間而改變。Java虛擬機可能會向系統釋放內存,而且提交的內存量可能會少於啓動時初始分配的內存量。提交的內存量老是大於或等於已用內存量。
Max:可用於內存管理的最大內存量。它的值可能會改變或者是未定義的。若是Java虛擬機嘗試增長使用的內存大於提交的內存,即便使用的數量小於或等於最大值(例如,當系統虛擬內存不足時),內存分配也可能會失敗。
GC time:垃圾收集的累積時間和總調用次數。它可能有多行,每行表明Java VM中使用的一個垃圾收集器算法。
右下角的條形圖顯示了堆和非堆內存中的內存池使用的內存。當使用的內存超過內存使用閾值時,條形會變成紅色。您能夠經過MemoryMXBean的屬性設置內存使用率閾值。
Java VM管理兩種內存:堆和非堆內存,這兩種內存都是在Java VM啓動時建立的:
堆內存是Java VM爲其分配全部類實例和數組的內存的運行時數據區域。堆能夠是固定的或可變的大小。垃圾收集器是一個自動內存管理系統,爲對象回收堆內存。
非堆內存包括在Java VM的內部處理或優化所需的全部線程和內存之間共享的方法區。它存儲每類結構,如運行時常量池,字段和方法數據以及方法和構造函數的代碼。方法區域在邏輯上是堆的一部分,但根據實現,Java VM可能不會垃圾收集或壓縮。像堆內存同樣,方法區域能夠是固定或可變的大小。方法區域的內存不須要是連續的。
除了方法區域以外,Java VM可能須要內存來進行內部處理或優化,這也屬於非堆內存。例如,即時(Just-In-Time,JIT)編譯器須要內存來存儲從Java VM代碼轉換來的高性能的本地機器代碼。
內存池和內存管理器是Java VM內存系統的關鍵方面。
內存池表示Java VM管理的內存區域。Java虛擬機至少有一個內存池,它可能會在執行期間建立或刪除內存池。內存池能夠屬於堆或非堆內存。
內存管理器管理一個或多個內存池。垃圾回收器是一種內存管理器,負責回收不可達對象所使用的內存。Java VM可能有一個或多個內存管理器。它可能會在執行期間添加或刪除內存管理器。一個內存池能夠由多個內存管理器來管理。
垃圾收集(GC)是Java VM如何釋放再也不被引用的對象佔用的內存。一般將具備活動引用的對象視爲「活着」,而且將不引用(或不可訪問)的對象視爲「死亡」。垃圾收集是釋放死對象所使用的內存的過程。GC使用的算法和參數可能會對性能產生顯着影響。
Java HotSpot VM垃圾收集器使用分代GC。世代GC利用了大多數程序符合如下歸納的觀察:
他們建立了不少壽命很短的對象,例如迭代器和局部變量。
他們建立了一些具備很長生命的對象,例如高級持久對象。
分代GC將內存分紅幾代,併爲每一個分配一個或多個內存池。當一代人使用其分配的內存時,VM會在該內存池上執行部分GC(也稱爲次要集合)來回收死對象所使用的內存。部分GC一般比FULL GC快得多。
Java HotSpot虛擬機定義了兩代:年輕一代(有時稱爲「託兒所」)和老一代。年輕一代包括一個"Eden space"和兩個"survivor spaces."。VM最初將全部對象分配到Eden空間,大多數對象都在那裏死掉。當它執行一個次要的GC時,虛擬機將全部剩餘的對象從Eden空間移動到其中一個倖存者空間。虛擬機將生存空間足夠長的物體移動到老一代的「終身」空間。當終身代填滿時,有一個完整的GC一般要慢得多,由於它涉及全部的活物。永久生成包含虛擬機自己的全部反射數據,例如類和方法對象。
世代的默認排列如圖3-7所示:
若是垃圾收集器已成爲瓶頸,則能夠經過自定義生成大小來提升性能。使用JConsole,您能夠經過嘗試使用垃圾收集器參數來調查性能指標的敏感性。有關更多信息,請參閱使用5.0 HotSpot VM調整垃圾回收。
「線程」選項卡提供有關線程使用的信息。
左下角的線程列表列出了全部活動的線程。若是在「過濾器」字段中輸入字符串,則「線程」列表將僅顯示名稱中包含您輸入的字符串的線程。單擊「線程」列表中線程的名稱可顯示有關該線程的信息,包括線程名稱,狀態和堆棧跟蹤。
該圖表顯示了隨着時間的推移活動線程的數量。顯示兩行:
紅:峯值線程數 藍色:活線程數。
線程MXBean提供了線程選項卡未涵蓋的其餘幾個有用的操做。
findMonitorDeadlockedThreads:檢測是否有任何線程在對象監視器鎖上死鎖。該操做返回一個死鎖的線程ID數組。
getThreadInfo:返回線程信息。這包括線程當前被阻塞的名稱,堆棧跟蹤和監視器鎖,以及哪一個線程持有該鎖,以及線程爭用統計信息。
getThreadCpuTime:返回給定線程消耗的CPU時間
經過在MBeans樹中選擇Threading MXBean,能夠經過MBeans選項卡訪問這些附加功能。這個MXBean列出了在被監控的Java VM中訪問線程信息的全部屬性和操做。請參閱監視和管理MBean。
要檢查你的應用程序是否已經遇到死鎖(例如,你的應用程序彷佛掛起),能夠經過單擊「檢測死鎖」按鈕來檢測死鎖的線程。若是檢測到任何死鎖的線程,則會顯示在「線程」選項卡旁邊的新選項卡中,如圖3-9所示。
「檢測死鎖」按鈕將檢測涉及對象監視器和java.util.concurrent可擁有同步器的死鎖週期(請參閱java.lang.management.LockInfo的API規範文檔)。在Java SE 6中添加了對java.util.concurrent鎖的監視支持。若是JConsole鏈接到J2SE 5.0 VM,則Detect Deadlock機制將僅查找與對象監視器相關的死鎖。JConsole不會顯示與可擁有的同步器相關的任何死鎖。
有關線程和守護進程線程的更多信息,請參閱java.lang.Thread的API文檔。
類選項卡顯示有關類加載的信息。
圖表繪製了隨着時間的推移加載的類的數量。
紅線是加載的類的總數(包括隨後卸載的類)。
藍線是當前加載的類的數量。
選項卡底部的「詳細信息」部分顯示自Java VM啓動以來加載的類的總數,當前加載的編號和卸載的編號。您能夠經過選中右上角的複選框來將類加載的跟蹤設置爲詳細輸出。
「VM摘要」選項卡提供有關Java VM的信息。
此選項卡中顯示的信息包括如下內容。
Summary
正常運行時間:Java VM啓動以來的總時間。
進程CPU時間:Java VM自啓動以來消耗的CPU時間總量。
總編譯時間:在JIT編譯中花費的總時間。Java VM肯定什麼時候發生JIT編譯。Hotspot虛擬機使用自適應編譯,其中VM使用標準解釋器啓動應用程序,而後在運行時分析代碼以檢測性能瓶頸或「熱點」。
Threads
活動線程:活動守護程序線程的當前數量加上非守護程序線程。
峯值:Java VM啓動以來的最大活動線程數
守護線程:當前的守護線程數量。
已啓動線程總數:Java VM啓動後啓動的線程總數,包括守護進程,非守護進程和終止線程。
Classes
當前加載的類:當前加載到內存中的類的數量。
加載的總類數:自Java VM啓動以來加載到內存中的類的總數,包括隨後被卸載的類。
卸載的總類數:自Java VM啓動以來從內存中卸載的類的數量。
Memory
當前堆大小:堆當前佔用的千字節數。
提交內存:分配給堆使用的內存總量。
最大堆大小:堆佔用的最大千字節數。
終止對象:終止對象的數量。
垃圾收集器:關於垃圾收集的信息,包括垃圾收集器名稱,執行的收集數量以及執行GC所花費的總時間。
Operating System
總物理內存:操做系統具備的隨機存取內存(RAM)的數量。
可用物理內存:可用於操做系統的可用RAM的數量。
提交的虛擬內存:保證可用於正在運行的進程的虛擬內存量。
Other Information
VM參數:應用程序傳遞給Java VM的輸入參數,不包括主方法的參數。
類路徑:系統類加載器用於搜索類文件的類路徑。
庫路徑:加載庫時要搜索的路徑列表。
引導類路徑:引導類加載器使用引導類路徑來搜索類文件。
「MBeans」選項卡以通用方式顯示有關在平臺MBean服務器中註冊的全部MBean的信息。MBeans選項卡容許您訪問整套平臺MXBean工具,包括在其餘選項卡中不可見的工具。另外,您可使用MBeans選項卡監視和管理應用程序的MBean。
左邊的樹顯示當前正在運行的全部MBean。當您在樹中選擇一個MBean,它的MBeanInfo和MBean描述都顯示在右側,和任何屬性,操做或通知出如今其下方的樹。
全部的平臺MXBeans及其各類操做和屬性均可以經過JConsole的MBeans選項卡訪問。
默認狀況下,MBean根據其對象名稱顯示在樹中。JConsole在將MBean添加到MBean樹時保留建立對象名稱時指定的關鍵屬性的順序。JConsole用於構建MBean樹的確切鍵屬性列表將是ObjectName.getKeyPropertyListString()方法返回的類型,第一個鍵爲type,第二個鍵爲j2eeType(若是存在)。
可是,當JConsole呈現MBean樹時,依賴於ObjectName關鍵屬性的默認順序有時會致使意外的行爲。例如,若是兩個對象名稱具備類似的鍵,但鍵順序不一樣,則相應的MBean將不會在MBean樹中的同一節點下建立。
例如,假設您使用如下名稱建立Triangle MBean對象:
com.sun.example:type=Triangle,side=isosceles,name=1 com.sun.example:type=Triangle,name=2,side=isosceles com.sun.example:type=Triangle,side=isosceles,name=3
就JMX技術而言,這些對象將以徹底相同的方式處理。對象名稱中鍵的順序與JMX技術沒有什麼區別。可是,若是JConsole鏈接到這些MBean,而且使用默認的MBean樹渲染,那麼對象com.sun.example:type = Triangle,name = 2,side = isosceles將最終建立在Triangle節點下的一個節點中稱爲2,這又將包含一個稱爲isosceles的子節點。另外兩個等腰三角形name = 1和name = 3將被組合在稱爲isosceles的不一樣節點的Triangle下,如圖3-13所示