jstatd,VisualVM使用和报错解决:Could not create remote object--java.security.AccessControlException

今天在使用jstatdVisualVM来查看Java程序运行的怎样,结果报错了:

-> # jstatd
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:897)
	at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:322)
	at java.base/java.lang.System.setProperty(System.java:888)
	at jdk.jstatd/sun.tools.jstatd.Jstatd.main(Jstatd.java:140)

然后官方资料说要配置权限:jstatd(1) — openjdk-11-jdk-headless — Debian testing — Debian Manpages

-> # cat jstatd-all.policy
grant codebase "file:${java.home}/../lib/tools.jar" {   
    permission java.security.AllPermission;
};

配好权限后还是报错。

-> # jstatd -J-Djava.security.policy=jstatd-all.policy  
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:897)
	at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:322)
	at java.base/java.lang.System.setProperty(System.java:888)
	at jdk.jstatd/sun.tools.jstatd.Jstatd.main(Jstatd.java:140)

然后看到了回答:Starting jstatd in Java 9+ - Stack Overflow
Java 9之后的版本不存在文件tools.jar,如果用的Java版本是Java 11,我用的是openjdk-java 11,配置文件需要这样写:

grant codebase "jrt:/jdk.jstatd" {    
   permission java.security.AllPermission;    
};

然后还不能正常运行:

-> # jstatd -J-Djava.security.policy=/home/ubuntu/jstatd-all.policy  -p 2333 
Exception in thread "main" java.lang.ExceptionInInitializerError
	at jdk.jstatd/sun.tools.jstatd.RemoteHostImpl.<init>(RemoteHostImpl.java:56)
	at jdk.jstatd/sun.tools.jstatd.Jstatd.main(Jstatd.java:141)
Caused by: java.security.AccessControlException: access denied ("java.util.PropertyPermission" "sun.jvmstat.monitor.local" "read")
	at java.base/java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
	at java.base/java.security.AccessController.checkPermission(AccessController.java:897)
	at java.base/java.lang.SecurityManager.checkPermission(SecurityManager.java:322)
	at java.base/java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1066)
	at java.base/java.lang.System.getProperty(System.java:845)
	at jdk.internal.jvmstat/sun.jvmstat.monitor.MonitoredHost.<clinit>(MonitoredHost.java:66)
	... 2 more

把策略文件修改如下:

-> # cat jstatd-all.policy 
grant codebase "jrt:/jdk.jstatd" {
   permission java.security.AllPermission;
};
grant codebase "jrt:/jdk.internal.jvmstat" {    
   permission java.security.AllPermission;    
};

现在可以正常运行了:

-> # jstatd -J-Djava.security.policy=/home/ubuntu/jstatd-all.policy         
jstatd started (bound to /JStatRemoteHost)


现在可以使用VisualVM远程连接,监控JVM了。


后记:
发现用VisualVM还是连不上,但是用netstat发现端口已经连上了。
在网上找到了问答:java - jvisualvm connect to remote jstatd not showing applications - Stack Overflow
这种问题出现在如果你的机器和远程的机器不在一个网络中,需要命令如下:

jstatd -J-Djava.security.policy=/home/ubuntu/jstatd-all.policy  -J-Djava.rmi.server.hostname=<the IP address to your Ubuntu server here>
-> % jstatd -J-Djava.security.policy=/home/ubuntu/jstatd-all.policy  -J-Djava.rmi.server.hostname=10.0.0.1 -p 2333

jstatd started (bound to /JStatRemoteHost)

现在可以成功连接了。

展开阅读全文
©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值