原文地址html
本文介紹利用VisualVm和jstatd來遠程監控Java進程的方法。java
要實現遠程監控Java進程,必須在遠程主機(運行Java程序的主機)上跑一個jstatd進程,這個進程至關於一個agent,用來收集遠程主機上的JVM運行狀況,而後用VisualVm鏈接到這個jstatd,從而實現遠程監控的目的。git
要注意的是,jstatd是一個RMI server application,所以在啓動時支持java.rmi properties。github
根據jstatd文檔,咱們須要在啓動jstatd時提供一個security policy文件:bash
grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };
而後運行下面命令啓動:oracle
jstatd -J-Djava.security.policy=jstatd.all.policy
不過這裏有一個陷阱,見SO上的這個提問:VisualVm connect to remote jstatd not showing applications。在啓動時還得指定rmi server hostname,不然VisualVm沒法看到遠程主機上的Java進程。因此正確的命令應該是這樣:app
jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=<host or ip>
遠程主機的hostname能夠隨便填,只要VisualVm可以ping通這個hostname就好了。因此說下面這幾種狀況都是可行的:ide
/etc/hosts
裏配置了some-name <ip-to-remote-host>
。jstatd啓動時指定-J-Djava.rmi.server.hostname=some-name
,VisualVm鏈接some-name
。192.168.xxx.xxx
,它的對外的NAT地址是172.100.xxx.xxx
。jstatd啓動時指定-J-Djava.rmi.server.hostname=172.100.xxx.xxx
,VisualVm鏈接172.100.xxx.xxx
。/etc/hosts
裏配置some-name <ip-to-remote-host-nat-address>
。jstatd啓動時指定-J-Djava.rmi.server.hostname=some-name
,VisualVm鏈接some-name
。還有要注意一點,運行jstatd
的用戶必須和運行Java程序的用戶相同,或者是root,不然會監控不到遠程主機上的Java進程。post
在你的機器上運行jvisualvm
啓動VisualVm。按照下面步驟添加遠程主機:ui
第一步
第二步
第三步
你就能看到遠程主機上的Java進程了。
須要注意的是若是你點開一個遠程進程,那麼你會發現有些信息是沒有的,好比:CPU、線程、和MBeans。這是正常的,若是須要這些信息(就像監控本地Java進程同樣),那麼就須要用JMX,相關內容會在另外一篇文章中講解。