用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了.