用VisualVM遠程監控Java進程

用visualvm遠程監視java進程的過程,假設遠程機器的 ip=192.168.1.235java


1.首先必須在遠程機器上面啓動jstatd這個後臺進程。它位於JDK安裝路徑的bin目錄裏面。配置java安全訪問,在jstatd所在的目錄的下新建文件jstatd.all.policy,在個人機器上是/usr/java/jdk1.7.0_05/binubuntu

grant codebase "file:${java.home}/../lib/tools.jar" {安全

 permission java.security.AllPermission;ide

};測試

注意結尾還有一個分號。spa


2.而後用以下命令啓動jstatd:.net

jstatd -J-Djava.security.policy=jstatd.all.policy命令行

正常啓動沒有任何輸出。默認打開端口是1099,也能夠經過-p 參數設置端口。code


3.在遠程機器上面用jps命令查詢啓動的java進程,執行結果以下:server

2301 Jstatd

2461 Jps

1689 Bootstrap

Jstatd就是啓動的jtatd後臺進程,Bootstrap是我以前已經啓動的一個Tomcat服務,Jps就是查詢命令本身的進程。


4.在本地機器上面啓動visualvm,選擇遠程->添加遠程主機.奇怪的是沒有任何錯誤提示,也沒有顯示出任何遠程的java進程,應該是沒有鏈接成功。用命令行 jps 192.168.1.235 的時候出現以下錯誤:

Error communication with remote host: Connection refused to host: 127.0.0.1; nested exception is

   java.net.ConnectException: Connection refused

奇怪,我明明指定了要鏈接的IP,爲何會告訴我鏈接127.0.0.1錯誤,怎麼會被重定向到本機來了。測試用了不一樣的機器去鏈接jstatd,都被重定向到了本機,而在遠程機器上面用jps 192.168.1.235,這樣卻能夠成功看到機器上面的java進程。問題大概就是爲何jstatd要重定向client到另一個ip呢?這個ip又是如何獲得的?

第一種解決方案:

hostname命令查看了遠程機器的server name和ip,分別是ubuntu-server 127.0.0.1,是否jstatd把這裏的ip返回給client端了呢?嘗試修改了/etc/hosts

127.0.0.1 ubuntu-server

替換爲

192.168.1.235 ubuntu-server

從新啓動jstatd進程。而後在本地用jps 192.168.1.235,竟然能夠看到遠程java進程了,不出意外的visualvm也能夠連上,遠程監控java進程的運行情況。

第二種解決方案:

jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.1.235


5.若是用命令行 jps 192.168.1.235 的時候出現以下錯誤:

RMI Registry not available at 192.168.1.235:1099

error during JRMP connection establishment; nested exception is:

       java.net.SocketException: Connection reset

則說明啓動了防火牆,關掉便可: service iptables stop.

而後就game over了.

相關文章
相關標籤/搜索