提出問題html
對於系統的活躍度比較高,承受的訪問壓力也很大的系統會出現比較嚴重的問題,可能一個是內存佔用高,一個是還有一些未知bug。因爲這些問題而想到咱們這兩個系統是否有內存泄露?是否能夠用某種方法來檢測內存泄露?固然通過google後,答案是確定的。因此咱們用測試環境來作一個實驗,來驗證檢測方法的可行性。下面就是詳細的整個過程。java
解決問題linux
一些概念服務器
一、什麼是JRockit?架構
Oracle JRockit JVM 是業界性能最高的 Java 虛擬機,現已內置於 Oracle 融合中間件中。它經過 JRockit Real Time 提供業內領先的實時基礎架構功能,經過 JRockit Mission Control 提供無與倫比的 JVM 診斷。oracle
以上是摘自官方的。其實它等同於sun的jdk,可是它多提供了一個JRockit Mission Control來對jvm的性能和內存泄露進行檢測。詳情可參照這裏jvm
第一步:下載性能
到這裏,而後點下載連接。選中上面的"接受許可協議"後方可下載。因爲咱們用的JBoss版本是4.2.1GA,是比較老的應用服務器,因此咱們這邊選擇下載的也是sun jdk1.5相對應的版本[Oracle JRockit Real Time 3.1.2 適用於 Java 版本 5.0]的那一列,中選擇linux-64位版本,文件名jrrt-3.1.2-1.5.0-linux-x64.bin。下載完後,拷貝到服務器上。測試
第二步:安裝google
以root身份登陸到服務器,在下載文件的目錄執行./jrrt-3.1.2-1.5.0-linux-x64.bin。而後選擇安裝目錄時候請鍵入/usr/ali/jrrt-3.1.2-1.5.0也是咱們要安裝的位置。而後按提示選擇。請不要安裝的/root/或者/usr/root/目錄下,那樣會產生權限問題而不能運行。一步一步到最後,提示安裝成功位置。安裝中的提示都是很簡單的,仔細查看酌情選擇選項便可。並新建一個link到安裝位置,執行以下命令 ln -s /usr/ali/jrrt-3.1.2-1.5.0 jrockit。
第三步:配置
一、首先將環境變量JAVA_HOME指向新建的link位置/usr/ali/jrockit。
執行以下命令:vi /etc/profile
打開profile文件,查找JAVA_HOME指向,將其改成/usr/ali/jrockit,保存並退出。
爲了讓這個更改立馬生效咱們執行 source /etc/profile 命令。
二、此時請切換到admin登陸帳號,更改JBoss啓動腳本,以此次diablo爲例修改的是/home/admin/shinkansen/bin/jbossctl
找到
JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=96m -XX:MaxPermSize=96m"
在這行後面加上這樣一行參數:
JAVA_OPTS="$JAVA_OPTS -verbosegc -Dcom.sun.management.jmxremote.port=端口號 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=服務器ip"
請本身指定端口號,這個端口是供Oracle JRockit Mission Control 來診斷jvm的,默認爲7091。
服務器ip請指定爲當前服務器ip。
第四步:啓動JBoss
請在admin帳號登陸下,執行/home/admin/shinkansen/bin/jbossctl restart重啓動JBoss。隨後請檢查啓動是否正常。
注意若是不能中止JBoss請執行ps aux|grep java 找到 shinkansen那個進程,用 kill -9 進程號 強殺掉
第五步:開始診斷
下載Oracle JRockit Mission Control 3.1.2
到這裏,而後點下載連接。選中上面的"接受許可協議"後方可下載。版本[Oracle JRockit Mission Control 3.1.2 適用於 Java 版本 5.0]的那一列,中選擇Windows x86位版本。在本機安裝。
安裝完成後打開主界面如圖:
而後右鍵見左邊欄的鏈接器,中選擇新建鏈接,出現新建鏈接窗口。
隨後出現了一個新的連接,點中它,右鍵選啓動memleak。
選中一個內存佔用比較高的類型,而後右鍵點跟蹤堆棧,以下圖。
這樣咱們就能夠從堆棧中追蹤到咱們的類。
至此咱們也找到了如何探測內存泄露的方法了。本文完。