一、jvisualvm监控远程jvm的两种连接方式

方式一:JMX

1. 服务端,添加配置

在tomcat/bin/catalina.sh文件中添加如下配置:

export JAVA_OPTS="-Xms256m -Xmx512m -Xss256m -XX:PermSize=512m -XX:MaxPermSize=1024m -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=10.7.93.127 -Dcom.sun.management.jmxremote.port=9015 -Dcom.sun.management.jmxremote.rmi.port=9015 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

详解:

  要使用jmx远程监控功能,在远程java application启动时,必须通过jvm选项配置提供远程服务的端口:

-Dcom.sun.management.jmxremote.port=9015

  一般同时指定为本地jmx client提供服务的端口与远程服务端口相同:

-Dcom.sun.management.jmxremote.rmi.port=9015

  jmx远程服务默认是开启ssl和认证功能功能的,也可以通过jvm选项把这两个功能关闭:

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

  还可以设置虚拟机参数:

-Xms256m -Xmx512m -Xss256m -XX:PermSize=512m -XX:MaxPermSize=1024m

  jmx默认是通过localhost的ip地址提供RMI服务的,如果要明确指定RMI服务地址或主机名(比如主机有多个接口,想使用非hostname关联的接口),可以通过以下选项显式指定:

-Djava.rmi.server.hostname=服务器IP

  这样开启jmx远程监控功能的最小配置具体如下:

-Xms256m 
-Xmx512m 
-Xss256m 
-XX:PermSize=512m 
-XX:MaxPermSize=1024m 
-Dcom.sun.management.jmxremote 
-Djava.rmi.server.hostname=服务器IP 
-Dcom.sun.management.jmxremote.port=9015 
-Dcom.sun.management.jmxremote.rmi.port=9015 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false

2. 重启tomcat

java application启动后,远程监控工具就可以通过<远程主机名或ip地址>:8777,或jmx服务地址service:jmx:rmi:///jndi/rmi://<远程主机名或ip地址>:8777/jmxrmi连接远程java application进行监控了

3. 客户端操作

3.1.启动jvisualvm.exe

找到jdk安装目录进入bin目录下, 双击 jvisualvm.exe

VisualVM 远程监控端口 jvisualvm远程连接_VisualVM 远程监控端口

启动后的界面

 

VisualVM 远程监控端口 jvisualvm远程连接_java_02

 3.2.配置JMX

 

VisualVM 远程监控端口 jvisualvm远程连接_java_03

 

VisualVM 远程监控端口 jvisualvm远程连接_远程服务_04

 

VisualVM 远程监控端口 jvisualvm远程连接_远程服务_05

 

VisualVM 远程监控端口 jvisualvm远程连接_java应用_06

 

方式二:JSTATD

1. 创建 XXX.policy文件

jdk 1.8发布包中包括一个jstatd程序,使用jstatd需要指定一个policy文件,文件的后缀为 .policy,

比如:jstatd-all.policy的文件,

内容为:亲测此内容有效

grant codebase "file:/usr/java/jdk1.8.0_212/lib/tools.jar" {
    permission java.security.AllPermission;
};

或者

grant codebase "file:${java.home}/../lib/tools.jar" {
    permission java.security.AllPermission;
};

2. 启动

./jstatd -J-Djava.security.policy=jstatd-all.policy &
或者指定端口
./jstatd -J-Djava.security.policy=jstatd-all.policy -p 9016 &

VisualVM 远程监控端口 jvisualvm远程连接_VisualVM 远程监控端口_07

3. 客户端配置

3.1.启动jvisualvm.exe

找到jdk安装目录进入bin目录下, 双击 jvisualvm.exe

VisualVM 远程监控端口 jvisualvm远程连接_VisualVM 远程监控端口

启动后的界面

 

VisualVM 远程监控端口 jvisualvm远程连接_java_02

 3.2.配置JMX

 

VisualVM 远程监控端口 jvisualvm远程连接_java_03

3.3.连接jstatd

VisualVM 远程监控端口 jvisualvm远程连接_远程服务_11

 

 

VisualVM 远程监控端口 jvisualvm远程连接_java应用_12

 

VisualVM 远程监控端口 jvisualvm远程连接_VisualVM 远程监控端口_13

 二、区别和利弊

1. jmx是jvm自身提供的一个标准的jmx管理功能,client支持度非常好,jvm监控工具基本上都会支持这种连接方式。而且只要配置几个简单的选项就可以使用了,不需要单独启动一个第三方的只用来监控连接的应用程序
2. jstatd是jdk提供的一个单独的工具,一个主机只需要运行一个jstatd就可以监控主机上所有的java application,而因为jmx是集成在jvm中,如果主机上有多个java应用程序需要监控,需要每个java应用程序配置相应的jmx选项,而且远程服务端口不能相同,client监控时也需要与每个java应用程序建立单独的连接
3. java应用程序启动时如果没有配置相应的jmx选项,则在运行周期内都无法远程监控应用程序,这可能会丧失定位问题的机会。而jstatd需要监控时,可以随时运行并进行监控在jvisualvm中,只有通过jstatd连接才能使用visualGC插件功能
4. jstatd server的端口是随机选择的,在有些情况下可能无法使用。比如我司的办公区域与生产区域之间网络设置了防火墙,只允许某个范围的端口通过,这是公司级的,某个团队无法修改防火墙策略。同时办公区域也不能直接ssh访问生产区域服务器,必须经过一个relay,也不能使用jstatd over ssh的方式。个人觉得jstatd不能在启动时显示指定服务的端口是它的一个槽点

5. jstatd不支持cpu监控