VisualVM連接遠程Java進程


jstatd是一個RMI(Remove Method Invocation)的server應用,用於監控jvm的創建和結束,並且提供接口讓監控工具(如VisualVM)可以遠程連接到本機的jvms 。注意是jvms,就是說運行jstatd命令后可以用監控工具監控本用戶(運行jstatd命令的用戶)所有已經啟動的java程序。

jstatd的安裝、啟動、連接

JDK中默認就帶 jstatd,如下圖,Mac 下 JDK 默認安裝在 /Library/Java/JavaVirtualMachines/版本號 目錄下。

image

 

啟動方式如下:

1、在服務器上新建文件,命名為jstatd.all.policy內容為:

grant codebase "file:${java.home}/../lib/tools.jar" { 
   permission java.security.AllPermission; 
}; 

2、在遠程主機上啟動 jstatd 並且不要關閉。

在服務器上jstatd.all.policy所在目錄下執行下面的命令
其中 /usr/local/java/bin/jstatd為jstatd所在路徑,為${JAVA_HOME}/bin/jstatd

/usr/local/java/bin/jstatd -J-Djava.security.policy=jstatd.all.policy 

想指定端口可以用下面命令:

jstatd -J-Djava.security.policy=jstatd.policy -p 1099

 

3、VisualVM 中連接

在客戶端用visualvm連接部署jstatd的服務器ip,顯示如下:
image

 

參考: http://comeonbabye.iteye.com/blog/1463133

添加完主機后,我們還需要添加 JMX 連接 和 jstatd 連接。

image

 

 

 

jstatd 的安全問題

jstatd服務只能監視具有適當的本地訪問權限的JVM,因此jstatd進程與被監控的JVM必須運行在相同的用戶權限中。但是有一些特殊的用戶權限,如基於UNIX(TM)為系統的root用戶,它有權限訪問系統中所有JVM的資源,如果jstatd進程運行在這種權限中,那么它可以監視系統中的所有JVM,但是這也帶來了額外的安全問題。

jstatd服務不會對客戶端進行任何的驗證,因此運行了jstatd服務的JVMs,網絡上的任何用戶的都具有訪問權限,這種暴露不是我們所希望的,因此在啟動jstatd之前本地安全策略必須要加以考慮,特別是在生產環境中或者是在不安全的網絡環境中。

如果沒有其他安全管理器被安裝,jstatd服務將會安裝一個RMISecurityPolicy的實例,因此需要在一個安全策略文件中指定,該策略文件必須符合的默認策略實施的策略文件語法。

下面的這個示例策略將允許jstatd服務具有JVM全部的訪問權限:

grant codebase "file:${java.home}/../lib/tools.jar" { 
   permission java.security.AllPermission; 
}; 

注:此處策略中的java.home,和JAVA_HOME不是一個概念,不要搞錯了,此處的java.home指的是JRE的路徑,這個是Java的系統屬性,不需要手工指定,通常是這個jdk下面的jre路徑,即可以認為${java.home}和${JAVA_HOME}/jre是等價,如果想查看這個變量的值,可以任意找一個運行着的Java應用,找到它的PID,然后通過如下jinfo命令查看就可以查看到java.home的值:

jinfo ${PID}|grep java.home

參考:

http://blog.csdn.net/fenglibing/article/details/17323515 

http://bijian1013.iteye.com/blog/2221434

 

JMX連接

jstatd的遠程監控,CPU的監控我這里看不到,這時候就要用到 JMX的連接了。

 

JMX 配置

遠程機器的程序需要加上JVM參數

-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=9090
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

備注:另外需要檢查 hostname –i,看解析出來是否為本地的IP,如是127.0.0.1或者IP為多個IP中之一,則其他的IP無效,會連接不上。

也可以使用如下的參數手動指定 hostname 或者 ip 地址

-Djava.rmi.server.hostname=192.168.0.1

然后就可以使用菜單中的 “Add JMX Connection”,連接遠程地址。

以 tomcat 為例, 我們需要修改 catalina.sh 文件。
在下面這行上面添加文字。
  1. # ----- Execute The Requested Command ----------------------------------------- 
需要添加的文字:

JAVA_OPTS="-Djava.rmi.server.hostname=10.12.49.64
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8081
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false $JAVA_OPTS"
export JAVA_OPTS

注:第一行的ip為tomcat所在服務器的ip;第三行的端口為jmx使用的端口,確保此端口是未被占用的;(不要少了第一行,我一開始配置的時候就是沒有第一行,jmx一直連接不上)

啟動tomcat,netstat -aux 看看8080,8081端口是否被監聽,如果被監聽,說明配置成功了,然后在visualvm的遠程選擇ip,右鍵,添加“jmx連接”,成功連接就成功了

參考: http://abc08010051.iteye.com/blog/2162970

參考:
http://www.360doc.com/content/11/1010/09/7656248_154804096.shtml



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM