使用jvisualVm监控本地和远程的jvm

jvisualVm是jdk自带的可视化监控工具,功能很强大,可安装各种扩展插件。能够在windows环境监控本地和远端(一般是无界面的linux系统)的java进程。

 

1、在远程机器上添加权限策略文件

     在服务器{JAVA_HOME}/bin目录建立文件:jstatd.all.policy(名字随便,符合*.policy即可), 文件内容为:

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

 

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

posted on 2021-04-07 11:07  DAMAER  阅读(543)  评论(0编辑  收藏  举报

导航