一、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
启动后的界面
3.2.配置JMX
方式二: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 &
3. 客户端配置
3.1.启动jvisualvm.exe
找到jdk安装目录进入bin目录下, 双击 jvisualvm.exe
启动后的界面
3.2.配置JMX
3.3.连接jstatd
二、区别和利弊
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监控