您好,登錄后才能下訂單哦!
小編給大家分享一下Java性能監(jiān)控的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
在前些日子,我們做了一些性能監(jiān)控的工作,有一些值得記錄的地方:
JDK自身提供了很多工具,基于命令行和GUI的都有,學(xué)會(huì)合理應(yīng)用它們是很有用處的。
首先是jmap,這是一個(gè)命令行程序,用來(lái)查看JVM中對(duì)象數(shù)量情況,直接輸入jmap會(huì)顯示用法,下面是兩個(gè)常用的功能:
Java代碼
jmap -histo 'jvmPid' > memory.txt
其中jvmPid為當(dāng)前虛擬機(jī)進(jìn)程的系統(tǒng)ID號(hào),等待過(guò)后,memory.txt會(huì)按空間占用由大到小的順序保存當(dāng)前虛擬機(jī)運(yùn)行中存在的對(duì)象類型,我們可以由此看出哪些類型對(duì)象占的空間和生成的數(shù)目較多,尤其是在自定義對(duì)象出現(xiàn)問(wèn)題導(dǎo)致不能及時(shí)回收,這個(gè)功能是很有用的。
Java代碼
jmap -heap:format=b 'jvmPid'
和上面的不同,上面是生成一個(gè)文本文件,而這里會(huì)生成一個(gè)二進(jìn)制快照文件,可以用相應(yīng)的分析軟件來(lái)打開(kāi)它來(lái)進(jìn)行功能更全面的檢測(cè),如Eclipse Memory Analyzer。
需要注意的是,上面的導(dǎo)出快照命令,在1G左右JVM內(nèi)存的情況下,要大概等待1分鐘左右的時(shí)間,且執(zhí)行時(shí)會(huì)使JVM暫停執(zhí)行,因此不要在正式運(yùn)行系統(tǒng)的高峰期或關(guān)鍵時(shí)刻使用。
接下來(lái)是jstat,這也是一個(gè)命令行程序,用來(lái)查看JVM的各個(gè)內(nèi)存和GC的使用情況,用法和參數(shù)非常多,有兩個(gè)我們用到的功能:
Java代碼
jstat -gcutil 'jvmPid'
會(huì)顯示此刻GC的情況,其中YGC和FGC代表小GC和大GC的次數(shù),YGCT和FGCT則代表小GC和大GC運(yùn)行的占用時(shí)間,正常情況下,大GC的次數(shù)應(yīng)遠(yuǎn)遠(yuǎn)小于小GC,例如我當(dāng)前的系統(tǒng)小GC已經(jīng)有10w次,而大GC只有50次,這是程序設(shè)計(jì)運(yùn)行良好的表現(xiàn)。
Java代碼
jstat -gccapacity 'jvmPid'
會(huì)顯示此刻GC各內(nèi)存池占用量,和上條命令結(jié)果結(jié)構(gòu)類似,同時(shí)也有一個(gè)問(wèn)題,顯示的數(shù)據(jù)不是很直觀,如果通過(guò)GUI觀看就好多了。
JVM自帶了GUI監(jiān)控狀態(tài)的功能,在JDK5中,我們需要做一些配置手動(dòng)開(kāi)啟它,首先我們要在JVM啟動(dòng)項(xiàng)增加一些屬性,假設(shè)我們的系統(tǒng)是一個(gè)運(yùn)行在tomcat容器下的項(xiàng)目,我們就可以修改JAVA_OPTS變量來(lái)開(kāi)啟監(jiān)控服務(wù)
Java代碼
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false"
這將開(kāi)啟遠(yuǎn)程基于jmx監(jiān)控的服務(wù)功能,這樣的配置方式,同時(shí)也開(kāi)啟了默認(rèn)的身份驗(yàn)證機(jī)制,我們還需要在另外的地方設(shè)置權(quán)限,用戶名和密碼才能登錄,我們先把這些服務(wù)端剩下的工作擱置一旁,先說(shuō)說(shuō)客戶端的部分。
我們需要GUI客戶端訪問(wèn)工具來(lái)遠(yuǎn)程查看該虛擬機(jī)的信息,JDK5自帶了一個(gè)名為jconsole的客戶端,可以在JDK目錄的bin文件夾下找到它并可以直接雙擊運(yùn)行,點(diǎn)擊“遠(yuǎn)程”標(biāo)簽,之后輸入遠(yuǎn)程IP,端口,用戶名和密碼,如服務(wù)端配置正常,即可成功訪問(wèn)。
回到服務(wù)端上來(lái),我們還需要配置JVM的遠(yuǎn)程用戶名和密碼,這個(gè)要修改$JAVA_HOME/jre/lib/management/jmxremote.access和jmxremote.password.template文件。
首先直接修改jmxremote.access文件,取消***兩個(gè)用戶名的注釋,改為
Java代碼
monitorRole readonly controlRole readwrite \ create javax.management.monitor.*,javax.management.timer.* \ unregister
這兩個(gè)用戶的區(qū)別顯而易見(jiàn),你取消一個(gè)當(dāng)然也可以。
然后修改jmxremote.password.template的文件名,將其改成jmxremote.password,之后同樣編輯***兩行用戶,將密碼改成你想要的,很簡(jiǎn)單吧。
之后還要做一步,將jmxremote.password文件的權(quán)限改為可讀可寫
Java代碼
chmod 600 $JAVA_HOME/jre/lib/management/jmxremote.password
至此,還有***一點(diǎn)需要注意,要將/etc/hosts文件中127.0.0.1修改成你真正的外網(wǎng)IP,如210.209.83.37,并且運(yùn)行hostname -i命令返回的IP也應(yīng)該是210.209.83.37才可以,每次修改完上述文件,要重新啟動(dòng)JVM,監(jiān)控服務(wù)才會(huì)生效。
大功告成,開(kāi)啟JVM以后,我們可以運(yùn)行jconsole客戶端,輸入IP端口,用戶名和密碼,用戶名為monitorRole或controlRole或你自定義的(權(quán)限不同)。
也可以免去用戶驗(yàn)證部分,只需要再加入-Dcom.sun.management.jmxremote.authenticate=false即可,也可以通過(guò)修改com.sun.management.jmxremote.password.file和com.sun.management.jmxremote.access.file自定義權(quán)限文件和密碼文件的位置,不過(guò)這也沒(méi)有什么太大必要。
成功登錄后,因?yàn)槭荊UI界面,所有信息可以很直觀的被我們所學(xué)習(xí)和接受,但還需要我們具備一些JVM的知識(shí),尤其是GC方面,有機(jī)會(huì)的話,會(huì)在以后的文檔中繼續(xù)說(shuō)明。
以上是“Java性能監(jiān)控的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。