杭州天眼教育

7x24小時咨詢熱線

400-660-3310

當(dāng)前位置 : 好學(xué)校 杭州天眼教育 學(xué)習(xí)資訊 資訊詳情

分享Java性能監(jiān)控的小技巧

2014-12-23

很多開發(fā)者覺得自己懂Java編程,事實(shí)是大多數(shù)開發(fā)人員都只領(lǐng)會到了Java平臺的皮毛,所學(xué)也只夠應(yīng)付工作。作者將深度挖掘Java平臺的核心功能,揭示一些鮮為人知的事實(shí),幫助您解決棘手的編程困難。

當(dāng)應(yīng)用程序性能受到損害時,大多數(shù)開發(fā)人員都驚慌失措,這在情理之中。跟蹤Java應(yīng)用程序瓶頸來源一直以來都是很麻煩的,因?yàn)镴ava虛擬機(jī)有黑盒效應(yīng),而且Java平臺分析工具一貫就有缺陷。

然而,隨著Java5中JConsole的引入,一切都發(fā)生了改變。JConsole是一個內(nèi)置Java性能分析器,可以從命令行或在GUIshell中運(yùn)行。它不是完美的,但是當(dāng)尖頭老板來問你關(guān)于性能的問題時,用它來應(yīng)對還是綽綽有余的——這比查詢PapaGoogle要好得多。

我們將向您展示5個方法,使您可以輕松地使用JConsole(或者,它更高端的“近親”VisualVM)來監(jiān)控Java應(yīng)用程序性能和跟蹤Java中的代碼。

1.遠(yuǎn)程連接進(jìn)程

因?yàn)閃eb應(yīng)用程序分析工具假設(shè)通過一個套接字進(jìn)行連通性分析,您只需要進(jìn)行少許配置來設(shè)置JConsole(或者是基于JVMTI的分析器,就這點(diǎn)而言),監(jiān)控/分析遠(yuǎn)程運(yùn)行的應(yīng)用程序。

如果Tomcat運(yùn)行在一個名為“webserve”的機(jī)器上,且JVM已經(jīng)啟動了JMX并監(jiān)聽端口9004,從JConsole(或者任何JMX客戶端)連接它需要一個JMX URL“service:jmx:rmi:///jndi/rmi://webserver:9004/jmxrmi”。

基本上,要分析一個運(yùn)行在遠(yuǎn)程數(shù)據(jù)中心的應(yīng)用程序服務(wù)器,您所需要的僅僅是一個JMX URL。

2.JDK附帶分析器

許多開發(fā)人員沒有意識到從Java 5開始JDK中包含了一個分析器。JConsole(或者Java平臺新版本,VisualVM)是一個內(nèi)置分析器,它同Java編譯器一樣容易啟動。如果是從命令行啟動,使JDK在PATH上,運(yùn)行jconsole即可。如果從GUIshell啟動,找到JDK安裝路徑,打開bin文件夾,雙擊jconsole。

當(dāng)分析工具彈出時(取決于正在運(yùn)行的Java版本以及正在運(yùn)行的Java程序數(shù)量),可能會出現(xiàn)一個對話框,要求輸入一個進(jìn)程的URL來連接,也可能列出許多不同的本地Java進(jìn)程(有時包含JConsole進(jìn)程本身)來連接。

使用JConsole進(jìn)行工作

在Java 5中,Java進(jìn)程并不是被設(shè)置為默認(rèn)分析的,而是通過一個命令行參數(shù)—-Dcom.sun.management.jmxremote——在啟動時告訴Java 5 VM打開連接,以便分析器可以找到它們;當(dāng)進(jìn)程被JConsole撿起時,您只能雙擊它開始分析。

分析器有自己的開銷,因此好的辦法就是花點(diǎn)時間來弄清是什么開銷。發(fā)現(xiàn)JConsole開銷簡單的辦法是,首先獨(dú)自運(yùn)行一個應(yīng)用程序,然后在分析器下運(yùn)行,并測量差異。(應(yīng)用程序不能太大或者太小;我喜歡使用JDK附帶的SwingSet2樣本。)因此,我使用-verbose:gc嘗試運(yùn)行SwingSet2來查看垃圾收集清理,然后運(yùn)行同一個應(yīng)用程序并將JConsole分析器連接到它。當(dāng)JConsole連接好了之后,一個穩(wěn)定的GC清理流出現(xiàn),否則不會出現(xiàn)。這就是分析器的性能開銷。

JConsole或VisualVM?

JConsole從Java 5開始就隨著Java平臺版本一起發(fā)布,而VisualVM是在NetBeans基礎(chǔ)上升級的一個分析器,在Java 6的更新版12中第一次發(fā)布。多數(shù)還沒有更新到Java 6,因此這篇文章主要介紹JConsole。然而,多數(shù)技巧和這兩個分析器都有關(guān)。

3.跟蹤統(tǒng)計

JConsole有許多對收集統(tǒng)計數(shù)據(jù)有用的選項(xiàng)卡,包括:

? Memory:在JVM垃圾收集器中針對各個堆跟蹤活動。

? Threads:在目標(biāo)JVM中檢查當(dāng)前線程活動。

? Classes:觀察VM已加載類的總數(shù)。

這些選項(xiàng)卡(和相關(guān)的圖表)都是由每個Java 5及更高版本VM在JMX服務(wù)器上注冊的JMX對象提供的,是內(nèi)置到JVM的。一個給定JVM中可用bean的完整清單在MBeans選項(xiàng)卡上列出,包括一些元數(shù)據(jù)和一個有限的用戶界面來查看數(shù)據(jù)或執(zhí)行操作。(然而,注冊通知是在JConsole用戶界面之外。)

使用統(tǒng)計數(shù)據(jù)

假設(shè)一個Tomcat進(jìn)程死于OutOfMemoryError。如果您想要弄清楚發(fā)生了什么,打開JConsole,單擊Classes選項(xiàng)卡,過一段時間查看一次類計數(shù)。如果數(shù)量穩(wěn)定上升,您可以假設(shè)應(yīng)用程序服務(wù)器或者您的代碼某個地方有一個ClassLoader漏洞,不久之后將耗盡PermGen空間。如果需要更進(jìn)一步的確認(rèn)問題,請看Memory選項(xiàng)卡。

不要成為典型

發(fā)現(xiàn)應(yīng)用程序代碼中性能問題的常用響應(yīng)多種多樣,但也是可預(yù)測的。早期的Java編程人員對舊的IDE可能十分生氣,并開始進(jìn)行代碼庫中主要部分的代碼復(fù)查,在源代碼中尋找熟悉的“紅色標(biāo)志”,像異步塊、對象配額等等。隨著編程經(jīng)驗(yàn)的增加,開發(fā)人員可能會仔細(xì)研究JVM支持的-X標(biāo)志,尋找優(yōu)化垃圾收集器的方法。當(dāng)然,對于新手,直接去Google查詢,希望有其他人發(fā)現(xiàn)了JVM的神奇的“make it go fast”轉(zhuǎn)換,避免重寫

收藏
分享到:

相關(guān)課程

相關(guān)資訊

杭州天眼教育

杭州天眼教育

認(rèn)證等級

信譽(yù)良好,可安心報讀

杭州天眼教育

已獲好學(xué)校V2信譽(yù)等級認(rèn)證

信譽(yù)值

  • (60-80)基礎(chǔ)信譽(yù)積累,可放心報讀
  • (81-90)良好信譽(yù)積累,可持續(xù)信賴
  • (91-100)充分信譽(yù)積累,推薦報讀

與好學(xué)校簽訂讀書保障協(xié)議:

  • 100%
  • 338
  • 30630
在線咨詢
;