jvisualvm结合jstatd进行远程监控

本文介绍如何使用JVisualVM进行远程监控,并详细说明了解决过程中遇到的连接问题及解决方案。通过配置jstatd和调整相关参数实现跨主机监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载于:http://mybeautiful.iteye.com/blog/1162555



  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代码  收藏代码
  1. <span style="font-size: small;">java.net.ConnectException: Connection refused: connect  
  2.     at java.net.PlainSocketImpl.socketConnect(Native Method)  
  3.     at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)  
  4.     at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)  
  5.     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)  
  6.     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)  
  7.     at java.net.Socket.connect(Socket.java:519)  
  8.     at java.net.Socket.connect(Socket.java:469)  
  9.     at java.net.Socket.<init>(Socket.java:366)  
  10.     at java.net.Socket.<init>(Socket.java:180)  
  11.     at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)  
  12.     at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)  
  13.     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)  
  14. Caused: java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:   
  15.     java.net.ConnectException: Connection refused: connect  
  16.     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601)  
  17.     at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)  
  18.     at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)  
  19.     at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:110)  
  20.     at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)  
  21.     at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)  
  22.     at $Proxy7.activeVms(Unknown Source)  
  23.     at sun.jvmstat.perfdata.monitor.protocol.rmi.RemoteVmManager.activeVms(RemoteVmManager.java:82)  
  24. Caused: sun.jvmstat.monitor.MonitorException: Error communicating with remote host: Connection refused to host: 127.0.0.1; nested exception is:   
  25.     java.net.ConnectException: Connection refused: connect  
  26.     at sun.jvmstat.perfdata.monitor.protocol.rmi.RemoteVmManager.activeVms(RemoteVmManager.java:85)  
  27.     at sun.jvmstat.perfdata.monitor.protocol.rmi.MonitoredHostProvider.activeVms(MonitoredHostProvider.java:217)  
  28.     at com.sun.tools.visualvm.jvmstat.application.JvmstatApplicationProvider.processNewHost(JvmstatApplicationProvider.java:126)  
  29.     at com.sun.tools.visualvm.jvmstat.application.JvmstatApplicationProvider.access$000(JvmstatApplicationProvider.java:69)  
  30.     at com.sun.tools.visualvm.jvmstat.application.JvmstatApplicationProvider$5$1.run(JvmstatApplicationProvider.java:276)  
  31.     at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572)  
  32. [catch] at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997)  
  33. ==>  
  34. </span>  

 

        据查,有两种方法解决,一种是把 /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. 连接成功后如图,


 
    其中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不够了。

### 配置和使用 JVisualVM 进行 Java 应用程序的远程性能监控 #### 启动 VisualVM 并准备环境 为了能够利用 VisualVM 对远程 Java 应用进行性能监控,首先要确保已经安装并启动了 VisualVM。此工具通常随 JDK 自带,也可从 Oracle 官网获取最新版。 #### 开启目标机器上的 JMX 支持 为了让 VisualVM 能够连接至远程主机上运行的应用,需在该应用程序启动参数中加入特定选项以启用 JMX 监听器,并指定监听地址与端口号: ```bash -Dcom.sun.management.jmxremote=true \ -Dcom.sun.management.jmxremote.port=9010 \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false ``` 上述命令片段展示了如何设置 JVM 参数来开放 JMX 接口[^2]。 #### 创建 JMX 远程连接配置文件 (可选) 对于某些场景下可能需要创建一个 `jmxremote.password` 和 `jmxremote.access` 文件用于安全认证;不过简单测试环境下可以暂时忽略安全性而禁用验证机制。 #### 添加远程主机到 VisualVM 中 回到本地计算机,在已启动的 VisualVM 主界面上点击左侧列表中的 "Remote" 项,接着右键选择 "Add Remote Host..." 输入要监视的服务所在服务器 IP 地址完成添加操作[^4]。 #### 建立具体应用实例间的链接 针对刚才新增加进去的目标设备,同样采用鼠标右键菜单里的 "Add JMX Connection..." 功能输入之前定义好的服务端口号(如上面例子提到过的 9010),从而建立实际业务逻辑单元之间的关联关系。 #### 查看与分析收集的数据 一旦建立了有效的通信渠道之后,就可以借助于图形化界面直观地观察 CPU 占用率、外/内存占用趋势图以及其他重要指标的变化情况了。此外还可以进一步深入探究诸如垃圾回收频率之类的细节信息以便做出针对性优化措施[^3]。 如果希望更全面了解GC行为,则建议同时部署 jstatd 来辅助提供更加详细的统计数据[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值