用VisualVM遠程監控Java進程

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


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

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

 permission java.security.AllPermission;

};

注意結尾還有一個分號。


2.然後用如下命令啓動jstatd:

jstatd -J-Djava.security.policy=jstatd.all.policy

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


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

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章