VisualVM鏈接遠程Java進程

jstatd是一個RMI(Remove Method Invocation)的server應用,用於監控jvm的建立和結束,而且提供接口讓監控工具(如VisualVM)能夠遠程鏈接到本機的jvms 。注意是jvms,就是說運行jstatd命令後能夠用監控工具監控本用戶(運行jstatd命令的用戶)全部已經啓動的java程序。html

jstatd的安裝、啓動、鏈接

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

image

 

啓動方式以下:tomcat

一、在服務器上新建文件,命名爲jstatd.all.policy內容爲:安全

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

二、在遠程主機上啓動 jstatd 而且不要關閉。網絡

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

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

想指定端口能夠用下面命令: .net

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

 

三、VisualVM 中鏈接code

在客戶端用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
相關文章
相關標籤/搜索