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服务,在命令行连续不断的抛出以下异常信息:
- 2010-7-26 11:06:25 com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl
- <init>
- 警告: "IOP00410201: (COMM_FAILURE) Connection failure: socketType: IIOP_CLEAR_TE
- XT; hostname: 127.0.0.1; port: 6888"
- org.omg.CORBA.COMM_FAILURE: vmcid: SUN minor code: 201 completed: No
- at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(O
- RBUtilSystemException.java:2172)
- at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(O
- RBUtilSystemException.java:2193)
- at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(
- SocketOrChannelConnectionImpl.java:205)
- at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(
- SocketOrChannelConnectionImpl.java:218)
- at com.sun.corba.se.impl.transport.SocketOrChannelContactInfoImpl.create
- Connection(SocketOrChannelContactInfoImpl.java:101)
- at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.begin
- Request(CorbaClientRequestDispatcherImpl.java:152)
- at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.request(CorbaC
- lientDelegateImpl.java:118)
- at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.is_a(CorbaClie
- ntDelegateImpl.java:211)
- at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.is_a(CorbaClie
- ntDelegateImpl.java:221)
- at org.omg.CORBA.portable.ObjectImpl._is_a(ObjectImpl.java:112)
- at org.omg.CosNaming.NamingContextHelper.narrow(NamingContextHelper.java
- :69)
- at com.sun.jndi.cosnaming.CNCtx.setOrbAndRootContext(CNCtx.java:345)
- at com.sun.jndi.cosnaming.CNCtx.initUsingCorbanameUrl(CNCtx.java:321)
- at com.sun.jndi.cosnaming.CNCtx.initUsingUrl(CNCtx.java:247)
- at com.sun.jndi.cosnaming.CNCtx.createUsingURL(CNCtx.java:85)
- at com.sun.jndi.url.iiop.iiopURLContextFactory.getUsingURLIgnoreRest(iio
- pURLContextFactory.java:56)
- at com.sun.jndi.url.iiop.iiopURLContext.getRootURLContext(iiopURLContext
- .java:44)
- at com.sun.jndi.toolkit.url.GenericURLContext.lookup(GenericURLContext.j
- ava:182)
- at javax.naming.InitialContext.lookup(InitialContext.java:351)
- at javax.management.remote.rmi.RMIConnector.findRMIServerJNDI(RMIConnect
- or.java:1817)
- at javax.management.remote.rmi.RMIConnector.findRMIServer(RMIConnector.j
- ava:1787)
- at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:25
- 9)
- at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFacto
- ry.java:248)
- at sun.tools.jconsole.ProxyClient.<init>(ProxyClient.java:117)
- at sun.tools.jconsole.ProxyClient.getProxyClient(ProxyClient.java:87)
- at sun.tools.jconsole.JConsole$2.run(JConsole.java:410)
- Caused by: java.net.ConnectException: Connection refused: connect
- at sun.nio.ch.Net.connect(Native Method)
- at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:464)
- at java.nio.channels.SocketChannel.open(SocketChannel.java:146)
- at com.sun.corba.se.impl.transport.DefaultSocketFactoryImpl.createSocket
- (DefaultSocketFactoryImpl.java:60)
- at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(
- SocketOrChannelConnectionImpl.java:188)
- ... 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服务器的资源占用情况,非常方便直观高效。
相关推荐
接下来,在Windows客户端,打开Jconsole,选择“远程主机”连接模式,输入Linux服务器的IP地址和之前配置的JMX端口号。如果一切配置正确,Jconsole将成功连接并显示JVM的详细信息。用户可以查看堆内存、非堆内存、...
jps 工具类似于 Unix/Linux 系统中的 ps 命令,用于列出本地或远程主机上正在运行的所有 Java 进程的 ID 和主类名或 JAR 文件名。这对于识别正在运行的 Java 应用程序非常有用,尤其是当系统中有多个 Java 进程时,...
例如,Unix/Linux系统下使用`ps`命令查找Java进程的PID,Windows系统则可以通过任务管理器或`jps`命令获取。连接命令格式为`jconsole [PID]`。 3. **远程监控**: 若要远程监控Java应用,需要知道目标主机的IP地址或...
2. jps:用于显示在本地或远程主机上由JVM启动的Java应用程序进程的标识符和状态。它类似于Unix/Linux系统中的ps命令。 3. jinfo:这个工具可以查看和修改JVM启动参数。jinfo可以连接到正在运行的Java进程或核心...
此外,还可以使用一些辅助工具,如VisualVM、jconsole等,它们可以提供JVM性能监控,有助于找出性能瓶颈或内存泄漏等问题。 总结起来,远程调试是解决复杂生产环境问题的关键技术,通过合理的配置和使用,开发者...
在Java开发中,有时我们需要对运行的JAR程序进行一些高级配置,比如调整虚拟机(JVM)的堆内存大小,开启远程监控等。本文将详细介绍如何在运行JAR程序时添加虚拟机(VM)参数。 首先,让我们理解什么是VM参数。VM...
- 使用`bin`目录下的`startup.sh`(Unix/Linux)或`startup.bat`(Windows)脚本来启动Tomcat服务。 - 同样,使用`shutdown.sh`或`shutdown.bat`来关闭Tomcat服务。 3. **部署Web应用** - 将WAR文件(Web应用的...
- 如果是远程监控,则需要确保目标主机上运行的应用程序启用了 JMX 服务。 - **主要功能**: - **概览**:显示应用程序的基本信息和总体运行状态。 - **内存**:展示堆和非堆内存使用情况。 - **线程**:提供...
3. 通过JConsole或VisualVM等工具远程诊断JVM问题。 八、扩展与集成 1. 安装Jasper编译器,支持JSP文件的动态编译。 2. 集成其他Servlet容器,如Jetty,实现负载均衡。 3. 通过 valves 和 filters 实现自定义请求...
- 可以通过在Tomcat安装目录下的`bin`目录运行`startup.bat`(Windows)或`startup.sh`(Linux/Unix)脚本来启动服务器。 - 使用`shutdown.bat`或`shutdown.sh`停止Tomcat服务。 5. **配置Tomcat**: - `conf`...
- 在Windows上,将zip文件解压到指定目录,然后添加环境变量`CATALINA_HOME`指向Tomcat的根目录。 - 在Linux或Unix系统中,使用命令行解压,并通过修改`/etc/environment`或创建`/etc/profile.d/tomcat.sh`来设置`...
- JMX允许远程监控和管理Tomcat实例,通过JConsole或其他JMX客户端工具实现。 7. **部署和更新应用:** - 可以通过`bin/deploy.sh`或`bin/deploy.bat`脚本部署WAR文件。 - 要更新应用,只需覆盖`webapps`目录下...
* jconsole:查看本地或远程 JVM 信息,包括内存、线程、装载类、 VM 摘要、 MBean 等。 实例演示: 在实例演示中,我们可以看到性能测试的实际应用场景,例如在电商网站中,需要对系统的性能进行评估,以确保在...
- **启动与停止**:通过执行`bin/startup.sh`(Unix/Linux)或`bin/startup.bat`(Windows)来启动Tomcat,使用`shutdown.sh`或`shutdown.bat`来停止。 2. **字符集设置** - **conf/server.xml**:在`<Connector>...
4. 启动与关闭:在bin目录下执行startup.bat(Windows)或sh startup.sh(Linux/Unix)启动Tomcat,关闭则使用shutdown.bat/shutdown.sh。 三、目录结构 - bin:包含启动和停止Tomcat的脚本。 - conf:存储服务器和...
配置`conf/catalina.properties`启用JMX,并使用像JConsole这样的工具进行连接。 六、安全与优化 1. **安全配置**:确保修改默认的管理员账号密码,避免未授权访问。同时,考虑使用SSL/TLS加密通信,保护数据安全...
Apache Tomcat 8.0.53是在Linux环境下使用的特定版本,它免去了用户从官方网站下载的麻烦,特别是对于那些网络带宽有限或者下载速度较慢的情况,这个版本提供了便利。Linux操作系统是基于Unix的开放源代码系统,广泛...