命令jstatd是一个RMI服务端程序,它的作用相当于代理服务器,建立本地计算机与远程监控工具的通信。jstatd服务器将本级的Java应用程序信息传递到远程计算机。
当我们直接打开jstatd服务器可能会抛出访问拒绝的异常。
这是由于jstatd程序没有足够的权限所致。可以使用java的安全策略,为其分配相应的权限,下面代码为jstatd分配了最大的权限,将其保存在jstatd.all.policy文件中:
grant codebase "file:/usr/java/jdk1.8.0_25/lib/tools.jar" {
permission java.security.AllPermission;
};
然后使用以下命令再次开启jstatd服务器
jstatd -J-Djava.security.policy=jstatd.all.policy
服务器启动成功。-J参数是一个公共的参数,如jps、jstat等命令都可以接受这个参数。由于jps、jstat命令本身也是Java应用程序,-J参数可以为jps等命令本身设置其java虚拟机参数
默认情况下,jstatd将在1099端口开启RMI服务器。
[root@zhw lib]# ss -lntup|grep 1099
tcp LISTEN 0 50 *:1099 *:* users:(("jstatd",pid=14542,fd=14))
接下来我们就可以在另一个机器上来查看本机的信息了。(我们规定这个服务器的域名为 dev.kidcares.cn)
当我们测试时,出下下面的错误。
[root@zhw lib]# jstat -gcutil 24252@dev.kidcares.cn:1099
Remote Exception attaching to rmi://24252@dev.kidcares.cn:1099
后来查询资料得知:
jstatd可以通过 内部 rmi和外部rmi 注册,除了在启动参数中加入权限意外,也必须加入Java.rmi.server.hostname=101.200.157.115 ,否则会出现 Remote Exception attaching to rmi://24252@101.200.157.115, 原因跟jconsole一样,服务端传过来的IP地址为 hostname -i的值,所以不一定是101.200.157.115
完整的jstatd启动选项为
jstatd -J-Djava.rmi.server.hostname=101.200.157.115 -J-Djava.security.policy=jstatd.all.policy
再次执行:
[root@zhw lib]# jstat -gcutil 24252@dev.kidcares.cn:1099
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 62.09 80.24 32.11 98.09 98.45 67 3.402 2 2.912 6.314
本文出自 “kisszero” 博客,请务必保留此出处http://kisszero.blog.51cto.com/9395417/1902359
原文地址:http://kisszero.blog.51cto.com/9395417/1902359