天天看點

jvisualvm結合jstatd進行遠端監控

       jvisualvm是Jdk自帶的,具體點,據說是jdk1.6-07後加到jdk中的。本地監控很簡單,在JAVA_HOME/bin中打開jvisualvm即可,所有本機的java程式會自動列出來。我們來說下遠端監控的問題。

       當然網上有很多相關資料,我就把我實踐的結果列出來吧。

              環境, 本地: WIN-XP sp3, jdk1.6.0_17 遠端:CentOS5.1, jdk1.6.0_3

      具體步驟如下,

       1. 啟動遠端jstatd.

           1.1 配置[b]java[/b]安全通路,将如下的代碼存為檔案 jstatd.all.policy (名字随便起),但要放到JAVA_HOME/bin中,其内容如下,

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

           1.2 進入到JAVA_HOME/bin中,執行./jstatd -J-Djava.security.policy=jstatd.all.policy 

       注:這時候能啟動正常,但是後面本地用 jvisualvm的時候抛異常,

java.net.ConnectException: Connection refused: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
	at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
	at java.net.Socket.connect(Socket.java:519)
	at java.net.Socket.connect(Socket.java:469)
	at java.net.Socket.<init>(Socket.java:366)
	at java.net.Socket.<init>(Socket.java:180)
	at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
	at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
	at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
Caused: java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is: 
	java.net.ConnectException: Connection refused: connect
	at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601)
	at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
	at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:110)
	at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
	at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
	at $Proxy7.activeVms(Unknown Source)
	at sun.jvmstat.perfdata.monitor.protocol.rmi.RemoteVmManager.activeVms(RemoteVmManager.java:82)
Caused: sun.jvmstat.monitor.MonitorException: Error communicating with remote host: Connection refused to host: 127.0.0.1; nested exception is: 
	java.net.ConnectException: Connection refused: connect
	at sun.jvmstat.perfdata.monitor.protocol.rmi.RemoteVmManager.activeVms(RemoteVmManager.java:85)
	at sun.jvmstat.perfdata.monitor.protocol.rmi.MonitoredHostProvider.activeVms(MonitoredHostProvider.java:217)
	at com.sun.tools.visualvm.jvmstat.application.JvmstatApplicationProvider.processNewHost(JvmstatApplicationProvider.java:126)
	at com.sun.tools.visualvm.jvmstat.application.JvmstatApplicationProvider.access$000(JvmstatApplicationProvider.java:69)
	at com.sun.tools.visualvm.jvmstat.application.JvmstatApplicationProvider$5$1.run(JvmstatApplicationProvider.java:276)
	at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572)
[catch] at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997)
==>

           

        據查,有兩種方法解決,一種是把 /etc/hosts中的ip改成實際的IP,然後重新開機網絡,但我用此法沒有解決問題。另一種是,在jstatd後加hostname的參數,如下,

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

       我用第二種方法解決了此問題。

        2.打開本地的jvisualvm, 右鍵Remort,選擇 "Add Remort Host...",在彈出框中輸入你的遠端IP,比如192.168.0.23. 連接配接成功後如圖,

jvisualvm結合jstatd進行遠端監控

    其中CPU一項顯示"NOT supported for this JVM",不知何故,難道是遠端的jdk版本需要更新到jdk1.6.0_17? 還沒有試。 另外“Perform GC”跟"Heap Dump"都亮,也不知何故。

     順便解釋下Heap跟PermGen的差別, 一般而言,PerGen放的是類的定義;而Heap裡面放的是類的執行個體;是以一般程式穩定運作後,PermGen基本保持不變,要變也隻會增加,因為GC隻會掃描heap中的執行個體;而Heap變化較大,OutOfMemory一般也是Heap不夠了。

繼續閱讀