概述
Jconsole是一个类似Windows任务管理器的图形化展示工具。可以监控Java服务的CPU、内存、线程、对象等各项指标。
Windows本地的Java服务可以在Jconsole启动的列表里面直接选,就可以连接上了;而大部分的Java服务都运行在没有GUI的Linux环境下,无法直接在Linux服务器上执行Jconsole命令。这时就需要在Windows上运行Jconsole远程连接到Linux服务器的Java服务了。网上有很多的教程,但通过实测发现都有问题,无法连接成功。通过不断查找资料并验证,终于找到了一个可行的配置方法,记录如下:
添加Java服务的启动参数
JAVA_OPTS=
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=192.168.182.53"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=12345"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.rmi.port=12345"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.local.only=false"
- 其中192.168.182.53是Java服务本机的IP地址;12345是Java对外服务的端口号。
- -Dcom.sun.management.jmxremote.rmi.port=12345 这个很关键。原因可参见:JCONSOLE的连接问题
除了8000正常端口外java还开了一个端口,而JConsole连接过来的是另一个端口,而且重启后这个端口是随机的,每次启动JVM都会变。tcpdump抓包发现每次都连接8000之后连另外随机的端口。没办法暂时防火墙只好开高端口。
可能rmi.port参数就是所谓的**随机端口**?(Java小白乱猜~)
- 不需要更改/etc/hosts文件。
配置Java服务器的防火墙
允许其他机器访问本机的12345端口。
测试环境
Java服务环境:
- OS: CentOS Linux release 7.0.1406 (Core)
- JDK: 1.8.0_181
Jconsole 环境:
- OS:Windows10 1803
- JDK: 1.8.0_172