天天看點

5招教你把握Java性能監控(轉自51testing)

  當應用程式性能受到損害時,大多數開發人員都驚慌失措,這在情理之中。跟蹤java應用程式瓶頸來源一直以來都是很麻煩的,因為java虛拟機有黑盒效應,而且java平台分析工具一貫就有缺陷。

  然而,随着java5中jconsole的引入,一切都發生了改變。jconsole是一個内置java性能分析器,可以從指令行或在guishell中運作。它不是完美的,但是當尖頭老闆來問你關于性能的問題時,用它來應對還是綽綽有餘的——這比查詢papagoogle要好得多。

  我們将向您展示5個方法,使您可以輕松地使用jconsole(或者,它更高端的“近親”visualvm)來監控java應用程式性能和跟蹤java中的代碼。

1.jdk附帶分析器

  許多開發人員沒有意識到從java 5開始jdk中包含了一個分析器。jconsole(或者java平台最新版本,visualvm)是一個内置分析器,它同java編譯器一樣容易啟動。如果是從指令行啟動,使jdk在path上,運作jconsole即可。如果從guishell啟動,找到jdk安裝路徑,打開bin檔案夾,輕按兩下jconsole。

  當分析工具彈出時(取決于正在運作的java版本以及正在運作的java程式數量),可能會出現一個對話框,要求輸入一個程序的url來連接配接,也可能列出許多不同的本地java程序(有時包含jconsole程序本身)來連接配接。

  使用jconsole進行工作

  在java 5中,java程序并不是被設定為預設分析的,而是通過一個指令行參數—-dcom.sun.management.jmxremote——在啟動時告訴java 5 vm打開連接配接,以便分析器可以找到它們;當程序被jconsole撿起時,您隻能輕按兩下它開始分析。

  分析器有自己的開銷,是以最好的辦法就是花點時間來弄清是什麼開銷。發現jconsole開銷最簡單的辦法是,首先獨自運作一個應用程式,然後在分析器下運作,并測量差異。(應用程式不能太大或者太小;我最喜歡使用jdk附帶的swingset2樣本。)是以,我使用-verbose:gc嘗試運作swingset2來檢視垃圾收集清理,然後運作同一個應用程式并将jconsole分析器連接配接到它。當jconsole連接配接好了之後,一個穩定的gc清理流出現,否則不會出現。這就是分析器的性能開銷。

  jconsole或visualvm?

2.遠端連接配接程序

  如果tomcat運作在一個名為“webserve”的機器上,且jvm已經啟動了jmx并監聽端口9004,從jconsole(或者任何jmx用戶端)連接配接它需要一個jmx url“service:jmx:rmi:///jndi/rmi://webserver:9004/jmxrmi”。

  基本上,要分析一個運作在遠端資料中心的應用程式伺服器,您所需要的僅僅是一個jmx url。

3.跟蹤統計

  jconsole有許多對收集統計資料有用的頁籤,包括:

  ◆memory:在jvm垃圾收集器中針對各個堆跟蹤活動。

  ◆threads:在目标jvm中檢查目前線程活動。

  ◆classes:觀察vm已加載類的總數。

  這些頁籤(和相關的圖表)都是由每個java 5及更高版本vm在jmx伺服器上注冊的jmx對象提供的,是内置到jvm的。一個給定jvm中可用bean的完整清單在mbeans頁籤上列出,包括一些中繼資料和一個有限的使用者界面來檢視資料或執行操作。(然而,注冊通知是在jconsole使用者界面之外。)

  使用統計資料

  假設一個tomcat程序死于outofmemoryerror。如果您想要弄清楚發生了什麼,打開jconsole,單擊classes頁籤,過一段時間檢視一次類計數。如果數量穩定上升,您可以假設應用程式伺服器或者您的代碼某個地方有一個classloader漏洞,不久之後将耗盡permgen空間。如果需要更進一步的确認問題,請看memory頁籤。

  不要成為典型

  發現應用程式代碼中性能問題的常用響應多種多樣,但也是可預測的。早期的java程式設計人員對舊的ide可能十分生氣,并開始進行代碼庫中主要部分的代碼複查,在源代碼中尋找熟悉的“紅色标志”,像異步塊、對象配額等等。随着程式設計經驗的增加,開發人員可能會仔細研究jvm支援的-x标志,尋找優化垃圾收集器的方法。當然,對于新手,直接去google查詢,希望有其他人發現了jvm的神奇的“make it go fast”轉換,避免重寫代碼。

  從本質上來說,這些方法沒什麼錯,但都是有風險的。對于一個性能問題最有效的響應就是使用一個分析器——現在它們内置在java平台,我們确實沒有理由不這樣做!

  4.為離線分析建立一個堆轉儲

  生産環境中一切都在快速地進行着,您可能沒有時間花費在您的應用程式分析器上,相反地,您可以為java環境中的每個事件照一個快照儲存下來過後再看。在jconsole中您也可以這樣做,在visualvm中甚至會做得更好。

  先找到mbeans頁籤,在其中打開com.sun.management節點,接着是hotspotdiagnostic節點。現在,選擇operations,注意右邊面闆中的“dumpheap”按鈕。如果您在第一個(“字元串”)輸入框中向dumpheap傳遞一個檔案名來轉儲,它将為整個jvm堆照一個快照,并将其轉儲到那個檔案。

  稍後,您可以使用各種不同的商業分析器來分析檔案,或者使用visualvm分析快照。(記住,visualvm是在java 6中可用的,且是單獨下載下傳的。)

  5.jconsole并不是高深莫測的

  作為一個分析器實用工具,jconsole是極好的,但是還有更好的工具。一些分析插件附帶分析器或者靈巧的使用者界面,預設情況下比jconsole跟蹤更多的資料。

  jconsole真正吸引人的是整個程式是用“普通舊式java”編寫的,這意味着任何java開發人員都可以編寫這樣一個實用工具。事實上,jdk其中甚至包括如何通過建立一個插件來定制jconsole的示例。建立在netbeans頂部的visualvm進一步延伸了插件概念。

  如果jconsole(或者visualvm,或者其他任何工具)不符合您的需求,或者不能跟蹤您想要跟蹤的,或者不能按照您的方式跟蹤,您可以編寫屬于自己的工具。如果您覺得java代碼很麻煩,groovy或jruby或很多其他jvm語言都可以幫助您更快完成。

  您真正需要的是一個快速而粗糙(quick-and-dirty)的由jvm連接配接的指令行工具,可以以您想要的方式确切地跟蹤您感興趣的資料。

上一篇: LNMP