`
kavy
  • 浏览: 888173 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

windows下如何正确使用Jconsole远程连接linux主机上的JVM

 
阅读更多

CATALINA_OPTS="-Djava.awt.headless=true -Xmx128M -server -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=7091 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"

 

背景说明:

客户端: Windows XP SP3,JDK 1.5.0_14;服务端:CentOS 5.4 Final(Rad Hat版本:5.1.19.6,linux核心:2.6.18-164.el5),JDK 1.6.0_21 for linux。

开始时,在Windows环境下,使用“jconsole”,连接CentOS下的一个Java服务,在命令行连续不断的抛出以下异常信息:

 

[java] view plaincopy
 
  1. 2010-7-26 11:06:25 com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl  
  2.  <init>  
  3. 警告: "IOP00410201: (COMM_FAILURE) Connection failure: socketType: IIOP_CLEAR_TE  
  4. XT; hostname: 127.0.0.1; port: 6888"  
  5. org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 201  completed: No  
  6.         at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(O  
  7. RBUtilSystemException.java:2172)  
  8.         at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(O  
  9. RBUtilSystemException.java:2193)  
  10.         at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(  
  11. SocketOrChannelConnectionImpl.java:205)  
  12.         at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(  
  13. SocketOrChannelConnectionImpl.java:218)  
  14.         at com.sun.corba.se.impl.transport.SocketOrChannelContactInfoImpl.create  
  15. Connection(SocketOrChannelContactInfoImpl.java:101)  
  16.         at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.begin  
  17. Request(CorbaClientRequestDispatcherImpl.java:152)  
  18.         at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.request(CorbaC  
  19. lientDelegateImpl.java:118)  
  20.         at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.is_a(CorbaClie  
  21. ntDelegateImpl.java:211)  
  22.         at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.is_a(CorbaClie  
  23. ntDelegateImpl.java:221)  
  24.         at org.omg.CORBA.portable.ObjectImpl._is_a(ObjectImpl.java:112)  
  25.         at org.omg.CosNaming.NamingContextHelper.narrow(NamingContextHelper.java  
  26. :69)  
  27.         at com.sun.jndi.cosnaming.CNCtx.setOrbAndRootContext(CNCtx.java:345)  
  28.         at com.sun.jndi.cosnaming.CNCtx.initUsingCorbanameUrl(CNCtx.java:321)  
  29.         at com.sun.jndi.cosnaming.CNCtx.initUsingUrl(CNCtx.java:247)  
  30.         at com.sun.jndi.cosnaming.CNCtx.createUsingURL(CNCtx.java:85)  
  31.         at com.sun.jndi.url.iiop.iiopURLContextFactory.getUsingURLIgnoreRest(iio  
  32. pURLContextFactory.java:56)  
  33.         at com.sun.jndi.url.iiop.iiopURLContext.getRootURLContext(iiopURLContext  
  34. .java:44)  
  35.         at com.sun.jndi.toolkit.url.GenericURLContext.lookup(GenericURLContext.j  
  36. ava:182)  
  37.         at javax.naming.InitialContext.lookup(InitialContext.java:351)  
  38.         at javax.management.remote.rmi.RMIConnector.findRMIServerJNDI(RMIConnect  
  39. or.java:1817)  
  40.         at javax.management.remote.rmi.RMIConnector.findRMIServer(RMIConnector.j  
  41. ava:1787)  
  42.         at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:25  
  43. 9)  
  44.         at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFacto  
  45. ry.java:248)  
  46.         at sun.tools.jconsole.ProxyClient.<init>(ProxyClient.java:117)  
  47.         at sun.tools.jconsole.ProxyClient.getProxyClient(ProxyClient.java:87)  
  48.         at sun.tools.jconsole.JConsole$2.run(JConsole.java:410)  
  49. Caused by: java.net.ConnectException: Connection refused: connect  
  50.         at sun.nio.ch.Net.connect(Native Method)  
  51.         at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:464)  
  52.         at java.nio.channels.SocketChannel.open(SocketChannel.java:146)  
  53.         at com.sun.corba.se.impl.transport.DefaultSocketFactoryImpl.createSocket  
  54. (DefaultSocketFactoryImpl.java:60)  
  55.         at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(  
  56. SocketOrChannelConnectionImpl.java:188)  
  57.         ... 23 more  

  

 

经过一系列不堪回首的漫长过程,发现这个问题可能是jconsole的bug,而此bug已经在sun的bug Report中列出来了,而且,目前此bug的状态:     State     11-Closed, Not a Defect, bug。关于此bug的具体信息请参考:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6209663

此时,使用linux的“hostname -i”命令查看,发现当前服务器的hostname为:127.0.0.1,使用“hostname newhosename”修改成实际的IP地址,仍然不能解决上述问题。

针对此bug,也有不少高手们提出了相应的解决方案,具体方案列表如下:(以下6条摘自:http://shallon.javaeye.com/blog/129750

使用JCONSOLE监控远程LINUX运行的JAVA进程,总是在报连接失败的错误。
1)被监控的服务器端增加启动参数

-Dcom.sun.management.jmxremote.port=8999
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false

2)本机上使用jconsole连接远程的8999端口
报连接失败,检查网络情况,8999端口有在监听等待,本地机器能够连接上对端机器的8999端口。切换了一台linux机器,情况依旧。

3)去网上找了一把,发现一个网友一年多前也在为此苦恼,所不同的是网友用的是JDK1.5,我用的是JDK 1.6。该网文链接如下:
http://svr.wjworld.net/soft/P1558/I7132389.shtml(发现已经不可用)

4)尝试抓包分析,发现是RMI的二进制协议,无法解读,报文中有127.0.0.1等字眼,从关键字判断是RMI下载的STUB文件。

5)继续查找,发现了一篇有价值的文章谈到这个问题,是服务器端解释机器名的问题,如果服务器端hostname -i被定向到127.0.0.1则会出现连接失败的问题。修改/etc/hosts文件,使hostname -i 指向正确的IP,JConsole终于可以正常连接。
这篇文章链接如下:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6209663

6)可能的问题原因分析:JCONSOLE连接上监控的进程,从监控进程下载了RMI远程调用的STUB文件?该STUB访问服务器的进程,
服务器端的地址可能是通过hostname -i类似机制获得。

综合上述方案,修改liunx下的hosts文件,相对简单,于是,修改/etc/hosts文件,将其第一行的“127.0.0.1  localhost.localdomain localhost”,修改为:“192.168.1.234  localhost.localdomain localhost”,其中,“192.168.1.234”为实际的服务器的IP地址。

重启linux,此时,在终端中输入“hosename -i”,结果为实际设置的IP地址,这里是192.168.1.234。再次使用jconsole连接此linux服务器,OK,一切正常,久违的JConsole图形界面显示出来。

另外,上述第一条中的“8999”为实际的需要监控的java服务的端口号。

但是,在实际情况下,第一条貌似不怎么管用,添加完第一条的参数后,应用服务器起不来了。

又找到另外一篇文章(出处:http://www.51testing.com/?uid-113838-action-viewspace-itemid-132703):

1、首先需要停止正在运行的服务:resin-XXX stop
2、然后在Linux的服务器启动项中添加如下信息:
-Djava.rmi.server.hostname=192.168.1.122
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=911
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
比如说我需要了解在压力测试过程中Linux系统中resin服务器的资源占用情况,那么我就可以在resin的启动项中加入上述信息,这样通过本机Windows中JDK的Jconsole来监控了。
其中第一个参数可以用来设置欲连接的Linux机器的IP地址,该项必须设置,否则远程连接会因为解析到127.0.0.1出现连接失败的情况。
如果不设置该项,也可以通过修改Linux的/etc/hosts文件,使hostname -i指向正确的IP,所以还是该选项更为方便。
第三个参数是设置欲连接到Linux机器上的端口号,在不跟Linux中现有端口冲突的情况下,可随意设置该端口
3、重新启动服务resin-XXX start
4、最后双击本机../jdk1.6/bin/jconsole.exe,启动Jconsole监控界面,在远程连接处输入:192.168.1.122:911,输入Linux主机的用户名和密码,连接即可,因为第2点中的第5项-Dcom.sun.management.jmxremote.authenticate=false,设置成了false,所以如果不知道Linux机器的用户名和密码,也可以不输入,直接连接
综上所述,该问题就解决啦,用户Jconsole来监控java服务器的资源占用情况,非常方便直观高效。

 

 

转自:http://blog.csdn.net/cyq1984/article/details/5766776

分享到:
评论

相关推荐

    使用Jconsole对java的内存使用情况(JVM)进行监控.doc

    接下来,在Windows客户端,打开Jconsole,选择“远程主机”连接模式,输入Linux服务器的IP地址和之前配置的JMX端口号。如果一切配置正确,Jconsole将成功连接并显示JVM的详细信息。用户可以查看堆内存、非堆内存、...

    jvm内存监控工具使用

    jps 工具类似于 Unix/Linux 系统中的 ps 命令,用于列出本地或远程主机上正在运行的所有 Java 进程的 ID 和主类名或 JAR 文件名。这对于识别正在运行的 Java 应用程序非常有用,尤其是当系统中有多个 Java 进程时,...

    jconsole+tomcat配置说明 附加Tomcat内存说明(基于jdk5.0).docx )

    例如,Unix/Linux系统下使用`ps`命令查找Java进程的PID,Windows系统则可以通过任务管理器或`jps`命令获取。连接命令格式为`jconsole [PID]`。 3. **远程监控**: 若要远程监控Java应用,需要知道目标主机的IP地址或...

    JVM-Tunning-Tools-Introduction

    2. jps:用于显示在本地或远程主机上由JVM启动的Java应用程序进程的标识符和状态。它类似于Unix/Linux系统中的ps命令。 3. jinfo:这个工具可以查看和修改JVM启动参数。jinfo可以连接到正在运行的Java进程或核心...

    远程调试

    此外,还可以使用一些辅助工具,如VisualVM、jconsole等,它们可以提供JVM性能监控,有助于找出性能瓶颈或内存泄漏等问题。 总结起来,远程调试是解决复杂生产环境问题的关键技术,通过合理的配置和使用,开发者...

    运行jar程序时添加vm参数的方法

    在Java开发中,有时我们需要对运行的JAR程序进行一些高级配置,比如调整虚拟机(JVM)的堆内存大小,开启远程监控等。本文将详细介绍如何在运行JAR程序时添加虚拟机(VM)参数。 首先,让我们理解什么是VM参数。VM...

    tomcat7服务器

    - 使用`bin`目录下的`startup.sh`(Unix/Linux)或`startup.bat`(Windows)脚本来启动Tomcat服务。 - 同样,使用`shutdown.sh`或`shutdown.bat`来关闭Tomcat服务。 3. **部署Web应用** - 将WAR文件(Web应用的...

    JDK自带VM分析工具

    - 如果是远程监控,则需要确保目标主机上运行的应用程序启用了 JMX 服务。 - **主要功能**: - **概览**:显示应用程序的基本信息和总体运行状态。 - **内存**:展示堆和非堆内存使用情况。 - **线程**:提供...

    tomcat8.0.5手册,帮助文档

    3. 通过JConsole或VisualVM等工具远程诊断JVM问题。 八、扩展与集成 1. 安装Jasper编译器,支持JSP文件的动态编译。 2. 集成其他Servlet容器,如Jetty,实现负载均衡。 3. 通过 valves 和 filters 实现自定义请求...

    Tomcat最新版+教你如何设置Tomcat

    - 可以通过在Tomcat安装目录下的`bin`目录运行`startup.bat`(Windows)或`startup.sh`(Linux/Unix)脚本来启动服务器。 - 使用`shutdown.bat`或`shutdown.sh`停止Tomcat服务。 5. **配置Tomcat**: - `conf`...

    tomcat安装包zip

    - 在Windows上,将zip文件解压到指定目录,然后添加环境变量`CATALINA_HOME`指向Tomcat的根目录。 - 在Linux或Unix系统中,使用命令行解压,并通过修改`/etc/environment`或创建`/etc/profile.d/tomcat.sh`来设置`...

    apache-tomcat-7.0.96.tar.gz

    - JMX允许远程监控和管理Tomcat实例,通过JConsole或其他JMX客户端工具实现。 7. **部署和更新应用:** - 可以通过`bin/deploy.sh`或`bin/deploy.bat`脚本部署WAR文件。 - 要更新应用,只需覆盖`webapps`目录下...

    性能测试分享-基础篇 ppt

    * jconsole:查看本地或远程 JVM 信息,包括内存、线程、装载类、 VM 摘要、 MBean 等。 实例演示: 在实例演示中,我们可以看到性能测试的实际应用场景,例如在电商网站中,需要对系统的性能进行评估,以确保在...

    tomcat服务器

    - **启动与停止**:通过执行`bin/startup.sh`(Unix/Linux)或`bin/startup.bat`(Windows)来启动Tomcat,使用`shutdown.sh`或`shutdown.bat`来停止。 2. **字符集设置** - **conf/server.xml**:在`&lt;Connector&gt;...

    tomcat7 压缩包

    4. 启动与关闭:在bin目录下执行startup.bat(Windows)或sh startup.sh(Linux/Unix)启动Tomcat,关闭则使用shutdown.bat/shutdown.sh。 三、目录结构 - bin:包含启动和停止Tomcat的脚本。 - conf:存储服务器和...

    tomcat安装配置等操作视频.rar

    配置`conf/catalina.properties`启用JMX,并使用像JConsole这样的工具进行连接。 六、安全与优化 1. **安全配置**:确保修改默认的管理员账号密码,避免未授权访问。同时,考虑使用SSL/TLS加密通信,保护数据安全...

    apache-tomcat8

    Apache Tomcat 8.0.53是在Linux环境下使用的特定版本,它免去了用户从官方网站下载的麻烦,特别是对于那些网络带宽有限或者下载速度较慢的情况,这个版本提供了便利。Linux操作系统是基于Unix的开放源代码系统,广泛...

Global site tag (gtag.js) - Google Analytics