1.远程JVM监控
【实践 01】简单介绍了 VisualJVM 监控本地 JVM GC 的使用,部分项目是部署在服务器的,远程监控怎么实现呢?需要借助于 JMX 技术实现。
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。它可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
1.1 监控远程Tomcat
参数说明:
- -Dcom.sun.management.jmxremote【开启JMX远程监控】
- -Dcom.sun.management.jmxremote.port=18080【JMX远程连接端口】
- -Dcom.sun.management.jmxremote.local.only=false【是否仅本机】
- -Dcom.sun.management.jmxremote.authenticate=false【不进行认证】
- -Dcom.sun.management.jmxremote.ssl=false 【不适用SSL】
# 修改tomcat的bin目录下catalina.sh 文件添加如下的参数(为了方便查看这里进行了换行) JAVA_OPTS=" -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=18080 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
没有部署在Tomcat里的项目,这里待补充…
1.2 远程监控Jar
1.2.1 jar包启动
# 阿尔萨斯的一个jar包,很小。 curl -O https://arthas.aliyun.com/math-game.jar java -jar math-game.jar
nohup java -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=18080 \ -Dcom.sun.management.jmxremote.local.only=false \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false \ -Djava.rmi.server.hostname=tcloud \ -jar math-game.jar \ > math-game.log 2>&1 &
1.2.2 远程 Host 和 JMX Connection 添加
端口号要与Dcom.sun.management.jmxremote.port
保持一致:
1.2.3 端口放开
添加后发现远程监控的服务并未上线:
# 1.查询进行号 [root@tcloud ~]# jps -l 11698 sun.tools.jps.Jps 7190 math-game.jar
# 2.查询进程绑定的所有端口 [root@tcloud ~]# lsof -i | grep 145546 java 7190 root 15u IPv6 43969808 0t0 TCP *:46447 (LISTEN) java 7190 root 16u IPv6 43969809 0t0 TCP *:18080 (LISTEN)
由于是云服务器,需要通过配置安全组放开18080
和46447
端口,放开后远程监控自动连接:
2.No supported for this JVM问题处理
在想要查看 Visual GC 时发现 No supported for this JVM.
的提示:
一头雾水啊,难道是 JDK 是 OpenJDK 的缘故吗?参考 [回答5] 处理了这个问题:
# 使用 jstatd 命令时报没有权限 [root@tcloud ~]# jstatd Could not create remote object access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write") java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write") at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) at java.security.AccessController.checkPermission(AccessController.java:886) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.System.setProperty(System.java:792) at sun.tools.jstatd.Jstatd.main(Jstatd.java:139)
# 1.查看JAVA_HOME [root@tcloud opt]# echo $JAVA_HOME /usr/local/java/jdk1.8.0_241
# 2.添加文件 vim ${JAVA_HOME}/jstatd.all.policy # 错误示范 grant codebase "file:${JAVA_HOME}/lib/tools.jar" { permission java.security.AllPermission; }; grant codebase "file:${JAVA_HOME}/../lib/tools.jar" { permission java.security.AllPermission; }; # 添加内容两种都行 grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; }; grant codebase "file:/usr/local/java/jdk1.8.0_241/lib/tools.jar" { permission java.security.AllPermission; };
# 3.启动 jstatd 代理(不报错说明启动成功)如果使用默认端口可不添加 -p # 测试时可以开启调用日志 -J-Djava.rmi.server.logCalls=true jstatd -J-Djava.security.policy=${JAVA_HOME}/jstatd.all.policy \ -J-Djava.rmi.server.hostname=tcloud \ -J-Djava.net.preferIPv4Stack=true \ -p 1099 &
# 4.服务启动(需要注意)依然要配置 JMX 否则无法查看 CPU 信息并且要注意 JMX 配置的 hostname 与 Jstatd 一致。 nohup java -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=18080 \ -Dcom.sun.management.jmxremote.local.only=false \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false \ -Djava.rmi.server.hostname=tcloud \ -jar math-game.jar \ > math-game.log 2>&1 &
启动Jstatd
后会有一个Jstatd
的连接,启动服务后会再有一个服务的连接,此时的服务连接与之前的JMX
连接是一样的,之前的JMX
连接也能够查看GC数据了:
3.VisualVM总结
- 可视化的工具很实用。
- jstatd报错踩坑有些多。