今天在使用jstatd和VisualVM来查看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)
现在可以成功连接了。

在使用jstatd和VisualVM进行远程JVM监控时遇到权限错误,通过查阅资料并修改Java安全策略文件解决了AccessControlException。问题涉及到Java 9+版本的变化,配置文件需要适配Java 11。最终,通过指定网络参数成功实现远程连接。
4610

被折叠的 条评论
为什么被折叠?



