
1 基础知识
2.1 RMI的概念
– RMI为Remote Method Invocation的缩写
– RMI中文翻译为远程方法调用
– RMI支持JVM中的代码通过网络远程调用另外一个JVM的某个方法
– RMI提供服务的一方称为服务器,而实现远程代用的一方称为客户端
2.2 jstatd的介绍
– jstatd命令是一个RMI服务器应用程序
– jstatd用于监视已检测的Java HotSpot VM的创建和终止
– jstatd支持通过接口来启用远程监视
– jstatd支持收集有关JVM进程的信息
2 最佳实践
2.1 环境配置
请参阅如下文章搭建Tomcat运行环境,
2.2 配置服务端
2.2.1 手动测试
sudo -u tomcat /usr/java/jdk-15.0.2/bin/jstatd -J-Djava.net.preferIPv4Stack=true -J-Djava.rmi.server.logCalls=true -p 1099 -r 1100
如果显示如下错误,
Could not create remote object java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write") at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) at java.base/java.security.AccessController.checkPermission(AccessController.java:1036) at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:408) at java.base/java.lang.System.setProperty(System.java:911) at jdk.jstatd/sun.tools.jstatd.Jstatd.main(Jstatd.java:153)
你需修使用如下命令改如下策略问题,
cp ${JAVA_HOME}/conf/security/java.policy ${JAVA_HOME}/conf/security/java.policy.save vim ${JAVA_HOME}/conf/security/java.policy
加入如下配置,
grant codebase "jrt:/jdk.jstatd" { permission java.security.AllPermission; }; grant codebase "jrt:/jdk.internal.jvmstat" { permission java.security.AllPermission; };
程序运行后,你可以使用如下命令获取进程号,
pgrep -u tomcat jstatd
可见如下显示,
3629
可以使用如下命令查看程序监听的端口,
netstat -antp | grep `pgrep -u tomcat jstatd`
可见如下显示,
tcp 0 0 0.0.0.0:1099 0.0.0.0:* LISTEN 3629/jstatd tcp 0 0 0.0.0.0:1100 0.0.0.0:* LISTEN 3629/jstatd
2.2.2 配置服务控制脚本
cat > /usr/lib/systemd/system/jstatd.service << EOF [Unit] Description=Monitor the creation and termination of instrumented Java HotSpot VMs After=network.target [Service] Type=exec Environment="JAVA_HOME=/usr/java/jdk-15.0.2" ExecStart=/usr/java/jdk-15.0.2/bin/jstatd -J-Djava.net.preferIPv4Stack=true -J-Djava.rmi.server.logCalls=true -p 1099 -r 1100 User=tomcat Group=tomcat UMask=0007 StandardOutput=file:/var/log/tomcat/jstatd.log StandardError=file:/var/log/tomcat/jstatd.log RestartSec=10 Restart=always [Install] WantedBy=multi-user.target EOF
修改完脚本后,你需要使用如下命令重载服务,
systemctl daemon-reload
你可使用如下命令控制服务和查询状态,
systemctl start jstatd.service systemctl status jstatd.service systemctl stop jstatd.service systemctl restart jstatd.service
测试完毕,建议你使用如下命令设置服务自动启动,
systemctl enable jstatd.service
2.2.3 配置防火墙
firewall-cmd --permanent --add-port 1099/tcp --add-port 1100/tcp firewall-cmd --reload firewall-cmd --list-all
2.3 连接服务端
2.3.1 安装客户端
2.3.2 连接服务端
如上图所示,
键入“Host name”的IP地址,范例为“192.168.0.22”
单击【OK】即可见到如下显示,
参阅文档
=====================
RMI的概念
—————
https://www.liaoxuefeng.com/wiki/1252599548343744/1323711850348577
jstatd的使用
—————-
https://docs.oracle.com/en/java/javase/15/docs/specs/man/jstatd.html
https://docs.oracle.com/javase/6/docs/technotes/tools/share/jstatd.html
https://manpages.debian.org/testing/openjdk-15-jdk-headless/jstatd.1.en.html
策略文件的修改方法
———————–
https://copyprogramming.com/howto/starting-jstatd-in-java-9
启动命令格式
——————–
https://drmanalo.github.io/blog/2017/monitor-remote-jvm.html
没有评论