隨筆 - 1, 文章 - 0, 評論 - 4, 引用 - 0
          數(shù)據(jù)加載中……

          【討論】關(guān)于Java性能監(jiān)控的一些記錄

              本篇所有內(nèi)容都是基于JDK5,如使用JDK6會有差別。
              在前些日子,我們做了一些性能監(jiān)控的工作,有一些值得記錄的地方:
              JDK自身提供了很多工具,基于命令行和GUI的都有,學(xué)會合理應(yīng)用它們是很有用處的。
              首先是jmap,這是一個命令行程序,用來查看JVM中對象數(shù)量情況,直接輸入jmap會顯示用法,下面是兩個常用的功能:
          jmap -histo 'jvmPid' > memory.txt
             
              其中jvmPid為當(dāng)前虛擬機(jī)進(jìn)程的系統(tǒng)ID號,等待過后,memory.txt會按空間占用由大到小的順序保存當(dāng)前虛擬機(jī)運(yùn)行中存在的對象類型,我們可以由此看出哪些類型對象占的空間和生成的數(shù)目較多,尤其是在自定義對象出現(xiàn)問題導(dǎo)致不能及時回收,這個功能是很有用的。
          jmap -heap:format='jvmPid'

              和上面的不同,上面是生成一個文本文件,而這里會生成一個二進(jìn)制快照文件,可以用相應(yīng)的分析軟件來打開它來進(jìn)行功能更全面的檢測,如Eclipse Memory Analyzer。
              需要注意的是,上面的導(dǎo)出快照命令,在1G左右JVM內(nèi)存的情況下,要大概等待1分鐘左右的時間,且執(zhí)行時會使JVM暫停執(zhí)行,因此不要在正式運(yùn)行系統(tǒng)的高峰期或關(guān)鍵時刻使用。
              接下來是jstat,這也是一個命令行程序,用來查看JVM的各個內(nèi)存和GC的使用情況,用法和參數(shù)非常多,有兩個我們用到的功能:
          jstat -gcutil 'jvmPid'

              會顯示此刻GC的情況,其中YGC和FGC代表小GC和大GC的次數(shù),YGCT和FGCT則代表小GC和大GC運(yùn)行的占用時間,正常情況下,大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)。
          jstat -gccapacity 'jvmPid'

              會顯示此刻GC各內(nèi)存池占用量,和上條命令結(jié)果結(jié)構(gòu)類似,同時也有一個問題,顯示的數(shù)據(jù)不是很直觀,如果通過GUI觀看就好多了。

              JVM自帶了GUI監(jiān)控狀態(tài)的功能,在JDK5中,我們需要做一些配置手動開啟它,首先我們要在JVM啟動項(xiàng)增加一些屬性,假設(shè)我們的系統(tǒng)是一個運(yùn)行在tomcat容器下的項(xiàng)目,我們就可以修改JAVA_OPTS變量來開啟監(jiān)控服務(wù)
          JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false"

              這將開啟遠(yuǎn)程基于jmx監(jiān)控的服務(wù)功能,這樣的配置方式,同時也開啟了默認(rèn)的身份驗(yàn)證機(jī)制,我們還需要在另外的地方設(shè)置權(quán)限,用戶名和密碼才能登錄,我們先把這些服務(wù)端剩下的工作擱置一旁,先說說客戶端的部分。

              我們需要GUI客戶端訪問工具來遠(yuǎn)程查看該虛擬機(jī)的信息,JDK5自帶了一個名為jconsole的客戶端,可以在JDK目錄的bin文件夾下找到它并可以直接雙擊運(yùn)行,點(diǎn)擊“遠(yuǎn)程”標(biāo)簽,之后輸入遠(yuǎn)程IP,端口,用戶名和密碼,如服務(wù)端配置正常,即可成功訪問。

              回到服務(wù)端上來,我們還需要配置JVM的遠(yuǎn)程用戶名和密碼,這個要修改$JAVA_HOME/jre/lib/management/jmxremote.access和jmxremote.password.template文件。

              首先直接修改jmxremote.access文件,取消最后兩個用戶名的注釋,改為
          monitorRole   readonly
          controlRole   readwrite \
                        create javax.management.monitor.
          *,javax.management.timer.* \
                        unregister

              這兩個用戶的區(qū)別顯而易見,你取消一個當(dāng)然也可以。
              然后修改jmxremote.password.template的文件名,將改成jmxremote.password,之后同樣編輯最后兩行用戶,將密碼改成你想要的,很簡單吧。
              之后還要做一步,將jmxremote.password文件的權(quán)限改為可讀可寫
          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才可以,每次修改完上述文件,要重新啟動JVM,監(jiān)控服務(wù)才會生效。
              大功告成,開啟JVM以后,我們可以運(yùn)行jconsole客戶端,輸入IP端口,用戶名和密碼,用戶名為monitorRole或controlRole或你自定義的(權(quán)限不同)。
              也可以免去用戶驗(yàn)證部分,只需要再加入-Dcom.sun.management.jmxremote.authenticate=false即可,也可以通過修改com.sun.management.jmxremote.password.file和 com.sun.management.jmxremote.access.file自定義權(quán)限文件和密碼文件的位置,不過這也沒有什么太大必要。
              成功登錄后,因?yàn)槭荊UI界面,所有信息可以很直觀的被我們所學(xué)習(xí)和接受,但還需要我們具備一些JVM的知識,尤其是GC方面,有機(jī)會的話,會在以后的文檔中繼續(xù)說明。

              PS:打個小廣告,公司正在做OA項(xiàng)目,急缺人手,如果兄弟們誰有意向,發(fā)簡歷(huangcai36@163.com)給我。水平可以培養(yǎng),但人要踏實(shí)!

          posted on 2011-03-10 12:44 黃小彩 閱讀(1805) 評論(4)  編輯  收藏

          評論

          # re: 【討論】關(guān)于Java性能監(jiān)控的一些記錄[未登錄]  回復(fù)  更多評論   

          好文~收藏~
          2011-03-10 19:00 | Bomber

          # re: 【討論】關(guān)于Java性能監(jiān)控的一些記錄[未登錄]  回復(fù)  更多評論   

          我們的OA快要上線了~~~
          2011-03-14 12:45 | dd

          # re: 【討論】關(guān)于Java性能監(jiān)控的一些記錄  回復(fù)  更多評論   

          不知貴公司的工作地點(diǎn)是哪里?
          2011-03-19 13:18 | apl

          # re: 【討論】關(guān)于Java性能監(jiān)控的一些記錄  回復(fù)  更多評論   

          @apl
          工作地點(diǎn)在廈門,在上海及廣州有分公司,如果您有意向,可以投一下簡歷。
          2011-03-22 16:56 | 黃小彩

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 河北省| 吉水县| 龙南县| 岳阳县| 东乌珠穆沁旗| 西城区| 大关县| 波密县| 呈贡县| 邵阳市| 资源县| 南丰县| 乌拉特中旗| 汕尾市| 济宁市| 延庆县| 南川市| 泰顺县| 黔南| 永兴县| 阜新| 招远市| 万州区| 徐州市| 武鸣县| 布尔津县| 汤阴县| 菏泽市| 申扎县| 西宁市| 中阳县| 新巴尔虎左旗| 简阳市| 白水县| 德钦县| 海口市| 孝感市| 凤翔县| 怀化市| 咸宁市| 黑山县|