使用jvisualVm監控本地和遠程的jvm


jvisualVm是jdk自帶的可視化監控工具,功能很強大,可安裝各種擴展插件。本篇不打算講解如果使用詳細的功能,只講在windows環境怎么監控本地和遠端(一般是無界面的linux系統)的java進程。

1、在遠程機器上添加權限策略文件

     在服務器{JAVA_HOME}/bin目錄建立文件:jstatd.all.policy(名字隨便,符合*.policy即可), 文件內容為:

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

2、修改服務器 hosts 文件中的 IP 地址

   要使Java VisualVM 成功連接到遠程服務器上,服務器端應該在 /etc/hosts 文件中把本機地址設為本機的 IP 地址。使用 hostname -i 命令查看,如果顯示的是 127.0.0.1 或者與本機實際 IP 不一致的話,需要把 /etc/hosts 文件中相應的地址改為本機實際 IP 。

3、運行 jstatd 守護程序

在jstatd.all.policy 當前目錄運行

nohup $JAVA_HOME/bin/jstatd -J-Djava.security.policy=jstatd.all.policy &

如果需要RMI 日志功能的話,還可以在啟動參數中加入 -J-Djava.rmi.server.logCalls=true 。

nohup $JAVA_HOME/bin/jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.logCalls=true &

可以自己制定jstatd的端口,加-p <port> 參數,默認端口為1099.

我擦,報錯了·····   

 Could not bind /JStatRemoteHost to RMI Registry
    java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
        java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
        java.lang.ClassNotFoundException: sun.jvmstat.monitor.remote.RemoteHost (no security manager: RMI class loader disabled)         at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:419)         at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)         at sun.rmi.transport.Transport$1.run(Transport.java:177)         at sun.rmi.transport.Transport$1.run(Transport.java:174)         at java.security.AccessController.doPrivileged(Native Method)         at sun.rmi.transport.Transport.serviceCall(Transport.java:173)         at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)         at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)         at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)         at java.lang.Thread.run(Thread.java:722)         at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273)         at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)         at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377)         at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)         at java.rmi.Naming.rebind(Naming.java:177)         at sun.tools.jstatd.Jstatd.bind(Jstatd.java:57)         at sun.tools.jstatd.Jstatd.main(Jstatd.java:143)

不用擔心,這種錯誤是你的端口被占用了,jstatd默認啟動1099端口,使用netstat -anp | grep 1099 看看端口是不是被占用了!如果被占用換一個端口。

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

4、使用本地jvisualVm連接遠程主機

進過1、2、3步驟,最后我們使用window本地的jvisualVm連接配置好的遠程主機,這個很簡單,不介紹。

但是問題來了,第3部的時候連接配置卻怎么也沒有看到遠程機器的java進程,排查這個問題,請確定你的一下步驟是否成功

(1)服務端機器jstatd服務是否開啟:使用jps查看是否有jstatd進程。

(2)確定本地機器是否連接上遠程服務器,使用netstat -anp | grep jstatd進程ID查看網絡連接,是否有你本地機器IP

配置並啟動jvisualvm

直接命令行啟動jvisualvm或{JAVA_HOME}/bin目錄,找到jvisualvm.exe程序,雙擊打開。

如果重新指定了jstatd端口,選擇高級設置修改端口,如下圖: 

通過以上方式連接服務器發現一個問題,不能監控CPU 。提示我們建立 JMX ,建立 JMX 提示要求端口號。(JMX: Java Management Extensions ,即 Java 管理擴展 , 是一個為應用程序、設備、系統等植入管理功能的框架。 JMX可以跨越一系列異構操作系統平台、系統體系結構和 網絡傳輸協議,靈活的開發無縫集成的系統、網絡和服務管理應用。而 Visual VM是通過 JMX 來和遠程 Java 應用聯系的 )。

5、jvm進程啟動項配置

以tomcat為例:

服務器的 tomcat 配置 jvm 啟動參數。 在 tomcat 的 catalina.sh 中添加如下參數:

JAVA_OPTS="-Djava.rmi.server.hostname=192.168.0.216 -Dcom.sun.management.jmxremote.port=1100 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
注:
-Dcom.sun.management.jmxremote.port :1100 這個是配置遠程 connection 的端口號的,要確定這個端口沒有被占用 -Dcom.sun.management.jmxremote.ssl=false  指定了 JMX 是否啟用 ssl -Dcom.sun.management.jmxremote.authenticate=false   指定了JMX 是否啟用鑒權(需要用戶名,密碼鑒權) 前面是固定配置,是 JMX 的遠程服務權限的 -Djava.rmi.server.hostname :這個是配置 server 的 IP 的

如果同時配置了JMX,可以在添加JMX連接如下圖: 

添加后如圖所示: 
 

 

本文轉載自:http://ihuangweiwei.iteye.com/blog/1219302


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM