您现在的位置: 万盛学电脑网 >> 网络安全 >> 网络基础知识 >> 正文

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

作者:佚名    责任编辑:admin    更新时间:2022-06-22

背景说明:

客户端: 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服务,在命令行连续不断的抛出以下异常信息:

  

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

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

针对此bug,也有不少高手们提出了相应的解决方案,具体方案列表如下:(以下6条摘自:)

使用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。该网文链接如下:
(发现已经不可用)

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

5)继续查找,发现了一篇有价值的文章谈到这个问题,是服务器端解释机器名的问题,如果服务器端hostname -i被定向到127.0.0.1则会出现连接失败的问题。修改/etc/hosts文件,使hostname -i 指向正确的IP,JConsole终于可以正常连接。
这篇文章链接如下:
?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服务的端口号。

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

又找到另外一篇文章(出处:?uid-113838-action-viewspace-itemid-132703):