使用JDK自帶jvisualvm監控tomcat和java程序

jvisualvm能監控內存泄露,跟蹤垃圾回收,執行時內存、cpu分析,線程分析,遠程監控Tomcat等等java

  jvisualvm已經被集成在jdk1.6以上的版本中(不是jre)。自身運行須要最低jdk1.6版本,可是能夠監控運行在jdk1.4以上版本的Java程序tomcat

  以jdk1.7.0_79自帶的jvisualvm來作說明,固然也可單獨下載獨立的jvisualvm,正常安裝完jdk後,至jdk的bin目錄下,運行jvisualvm.exe便可安全

  在jdk目錄下的bin目錄中能夠找到jvisualvm.exe文件、直接啓動能夠看到以下界面:服務器

  

\

 

  以上是已經鏈接遠程的界面。直觀的監控界面、更有助於咱們分析tomcat的運行狀況。tcp

  下面主要介紹下怎麼樣使用本地jvisualvm監控遠程tomcat。性能

  下面是個人配置方法:測試

  在tomcat/bin目錄下打開startup.sh或者startup.bat,在最後一行前面加上,也就是:.net

  exec "$PRGDIR"/"$EXECUTABLE" start "$@"插件

  前面加上線程

  export CATALINA_OPTS="$CATALINA_OPTS

  -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.1.10 -Dcom.sun.management.jmxremote.port=10002 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

  參數說明:

  指定了JMX啓動的代理端口,這個端口就是visualvm要鏈接的端口(10002端口不能被別的程序使用netstat -an|gerp 10002)

  Dcom.sun.management.jmxremote.port=10002

  指定了JMX是否啓用ssl

  Dcom.sun.management.jmxremote.authenticate=false

  指定了JMX是否啓用鑑權(須要用戶名,密碼鑑權)

  Dcom.sun.management.jmxremote.authenticate=false

  指定了服務器主機名

  Djava.rmi.server.hostname=192.168.1.10

  配置JMX訪問文件 增長下面內容

  export CATALINA_OPTS="$CATALINA_OPTS

  -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.1.10 -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.access.file=$CATALINA_HOME/conf/jmxremote.access -Dcom.sun.management.jmxremote.password.file=$CATALINA_HOME/conf/jmxremote.password"

  # cd $CATALINA_HOME/conf/

  # cp $JAVA_HOME/jre/lib/management/jmxremote.password.template jmxremote.password

  # chmod 700 jmxremote.password (必定注意這個文件默認是不可寫的)

  # vi $CATALINA_HOME/conf/jmxremote.password

  在最下面添加一個用戶(第一個是用戶名 第二個是密碼)

  jiu 123456

  # chmod 400 jmxremote.password (要求該文件是任何用戶均不可寫的)

  # cp $JAVA_HOME/jre/lib/management/jmxremote.access jmxremote.access

  # vi jmxremote.access (該文件是對jmx用戶的受權)

  到最後一行 將

  monitorRole readonly

  controlRole readwrite

  註釋 更改成

  # monitorRole readonly

  # controlRole readwrite

  而後在最後添加一行

  jiu readwrite

  # chmod 400 jmxremote.access

  若是沒有這一步、使用startup啓動不了tomcat。

  按照上述配置、再使用startup.sh啓動tomcat。

  這裏特別注意要開放10002本身設置的端口。

  打開防火牆,使外部能訪問

  /etc/init.d/iptables status

  /sbin/iptables -I INPUT -p tcp --dport 100002 -j ACCEPT #開啓10002端口

  /etc/rc.d/init.d/iptables save #保存配置

  /etc/rc.d/init.d/iptables restart #重啓服務

  若是連接不上能夠先關閉防火牆測試一下

  /etc/init.d/iptables stop

  接下來就是使用jvisualvm來遠程監控tomcat了

  右鍵點擊遠程-添加遠程主機-輸入主機ip地址

  

\

 

  添加遠程主機以後,點擊遠程主機右鍵-添加jmx鏈接:

  彈出登陸框

  

\

 

  輸入主機名:端口號,若是配置了用戶名和密碼,請輸入用戶名和密碼。而後點擊肯定。

  點擊肯定以後、在遠程主機下會有一個jmx鏈接,打開鏈接,點擊監視tab,能夠看到以下界面了。

  

\

 

  在上圖中能夠看到cpu利用率和垃圾回收活動(這個在分析tomcat性能時也很重要)。而後是堆棧使用狀況。下面是類的使用狀況,最後一個是線程活動狀況。

  點擊線程tab能夠看到:

  

\

 

  上圖能夠很是清晰的看到線程活動狀況,那些線程正在執行,哪些線程正在等待中,以及執行完畢的線程等。

  這裏能夠看到每一個線程的狀態,點擊某個線程右鍵能夠查看該線程的詳細狀況:

  

\

 

  使用左上角的線程dump按鈕,還能夠看到線程的堆棧狀況,這樣就能夠具體分析線程是在什麼地方進入等待,什麼地方進入休眠,以及什麼地方一直處於執行狀態。這也是一個性能分析利器哦!

  

\

 

  監控服務器上的java程序

  相較於監控tomcat要麻煩不少,要預先啓動jstatd服務(${java_home}/bin目錄下)

  jstatd是一個監控JVM從建立到銷燬過程當中資源佔用狀況並提供遠程監控接口的RMI(Remote Method Invocation,遠程方法調用)服務器程序,它是一個Daemon程序(後臺進程),要保證遠程監控軟件鏈接到本地的話須要jstatd始終保持運行。

  jstatd運行須要經過-J-Djava.security.policy=***指定安全策略,所以咱們須要在服務器上創建一個指定安全策略的文件jstatd.all.policy(我放在了${java_home}/bin目錄下),文件內容以下:

  [plain] view plain copy

  grant codebase "file:/usr/java/jdk1.7.0_79/lib/tools.jar" {

  permission java.security.AllPermission;

  };

  而後使用這個策略文件啓動jstatd服務

  [plain] view plain copy

  [root@localhost bin]# pwd

  /usr/java/jdk1.7.0_79/bin

  [root@localhost bin]$ ./jstatd -J-Djava.security.policy=./jstatd.all.policy &

  由於監控的過程當中須要jstatd服務一直運行,因此加上了&,若是須要日誌也可以使用:

  [plain] view plain copy

  ./jstatd -J-Djava.security.policy=./jstatd.all.policy -J-Djava.rmi.server.logCalls=true

  接下來就能夠在jvisualvm中配置監控該服務器上運行的java程序了,和在jvisualvm中配置監控tomcat服務器的操做過程是同樣的

  須要特別注意的是,有時在配置遠程監控java程序的時候jvisualvm會報一個錯誤

  點擊查看錯誤詳情:

  

\

 

  connection refused to host:127.0.0.1初步判斷和主機名有關係

  [plain] view plain copy

  [root@localhost bin]# hostname -i

  127.0.0.1 [plain] view plain copy

  [root@localhost bin]# hostname 192.168.1.10

  修改完重啓jstatd服務(網上不少人說要修改主機的/etc/hosts文件,可是我本身測試修改/etc/hosts文件是沒有效果的,必需要修改主機名)

  

\

 

  填寫主機名:

  

\

 

  這裏要選添加一個jstatd鏈接:

  

\

 

  直接選擇默認配置便可(默認使用1099端口):

  

\

 

  點擊ok後,168上的全部java程序就會自動列出:

  

\

 

  PS:

  jvisualvm也是能夠安裝插件的,具體步驟爲tool -> plugin ->aviable plugin,推薦一個很是好用的插件VisualGC

  

\

 

  安裝完這個插件後,將會增長新的監控條目Visual GC,能夠看到虛擬機內存各個區的使用狀況

  

\

相關文章
相關標籤/搜索