![alt](https://i-blog.csdnimg.cn/blog_migrate/1575c5d427e44d8ee294598ad966ced4.gif)
java-jvm-tool
Jstatd 远程连接(推荐)
不用重启项目
远程机配置
[demo@localhost jvmtest]$ vi jstatd.all.policy
# 内容
grant codebase "file:/home/demo/jdk1.8.0_171/lib/tools.jar" {
permission java.security.AllPermission;
};
#IP为远程机外网IP(必须配置ip地址)
[demo@localhost jvmtest]$ nohup jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=172.16.29.61 -p 1099 -J-Djava.rmi.server.logCalls=true &
[1] 203089
[demo@localhost jvmtest]$ nohup: 忽略输入并把输出追加到"nohup.out"
[demo@localhost jvmtest]$
[demo@localhost jvmtest]$ tail -f nohup.out
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:884)
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)
十二月 19, 2023 2:28:49 下午 sun.rmi.server.UnicastServerRef logCall
较详细: RMI TCP Connection(1)-127.0.0.1: [127.0.0.1: sun.rmi.registry.RegistryImpl[0:0:0, 0]: void rebind(java.lang.String, java.rmi.Remote)]
十二月 19, 2023 2:28:50 下午 sun.rmi.server.UnicastServerRef logCall
较详细: RMI TCP Connection(2)-172.16.29.61: [172.16.29.61: sun.rmi.transport.DGCImpl[0:0:0, 2]: java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[], long, java.rmi.dgc.Lease)]
# 记得防火墙开端口或者直接关闭防火墙
[root@localhost ~]# firewall-cmd --zone=public --add-port=1099/tcp --permanent
[root@localhost ~]# firewall-cmd --reload
客户端连接
在配置好环境变量的前提下,直接在cmd
下执行 jvisualvm
命令。
![客户端运行jvisualvm](https://i-blog.csdnimg.cn/blog_migrate/772d35892fe5e7425fc712def4c965fe.png)
![visualvm中添加远程机](https://i-blog.csdnimg.cn/blog_migrate/61617349f1389ba547b62fc6c7e18931.png)
选中添加的远程机,右击,点击【添加 jstatd 连接】,可以设置端口以及刷新时间。
![jstatd端口配置](https://i-blog.csdnimg.cn/blog_migrate/3b05b0320114dd5df52f7baaaf4636f1.png)
![配置详情](https://i-blog.csdnimg.cn/blog_migrate/9339d117da098466c9b51162084ae9a7.png)
![最终结果](https://i-blog.csdnimg.cn/blog_migrate/077d22a1fcffb2d8ab3b1f938cc6aa0b.png)
JMX 连接
服务端启动配置
-Dcom.sun.management.jmxremote.port=8999 \
-Dcom.sun.management.jmxremote.rmi.port=8999 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Djava.rmi.server.hostname=172.16.29.61 \
客户端连接
jvisualvm
首先,右击【远程】,点击【添加远程主机】
然后,右击添加的主机,点击【添加 JMX 连接】,输入对应端口号。
![添加JMX连接](https://i-blog.csdnimg.cn/blog_migrate/96e287526b8802db4c7a8beca5d1f35b.png)
jconsole
在配置好环境变量的前提下,直接在cmd
下执行 jconsole
命令。
![新建连接](https://i-blog.csdnimg.cn/blog_migrate/bf1639c5a134b05f3ecc8b880cd76ee4.png)
![可检测死锁](https://i-blog.csdnimg.cn/blog_migrate/ea1cd07334a0b5251c3e861b81cbcfaa.png)
补充
linux shell 参数换行(标准说法:续行)
\Enter,反斜杠后面紧跟回车,表示下一行是当前行的续行。(For Windows, use the carat (^
) instead of the backslash (\
) to break up a long command into multiple lines)
nohup java -jar -XX:MetaspaceSize=1024m \
-XX:MaxMetaspaceSize=2048m \
-Dcom.sun.management.jmxremote.port=8999 \
-Dcom.sun.management.jmxremote.rmi.port=8999 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Djava.rmi.server.hostname=172.16.29.61 \
-Dlog4j2.formatMsgNoLookups=true \
${APP_NAME} --server.port=8082 >> logs/8082.log 2>&1 &
问题
java.security.AccessControlException: access denied
可将文件 jstatd.all.policy 文件中的${JAVA_HOME}写成绝对路径即可。
参考
Monitoring and Management Using JMX Technology
Monitoring and Management Guide
Enabling remote JMX with password authentication only (apache.org)
本文由 mdnice 多平台发布