歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> 使用JDK自帶jvisualvm監控tomcat和java程序

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

日期:2017/3/1 11:43:19   编辑:關於Linux
  jvisualvm能監控內存洩露,跟蹤垃圾回收,執行時內存、cpu分析,線程分析,遠程監控Tomcat等等

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

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

  在jdk目錄下的bin目錄中可以找到jvisualvm.exe文件、直接啟動可以看到如下界面:

  

\

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

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

  下面是我的配置方法:

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

  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,可以看到虛擬機內存各個區的使用情況

  

\
Copyright © Linux教程網 All Rights Reserved