我尝试在linux机器上运行jstatd jvm监控工具
jboss@hostAddr:/usr/java/jdk1.6.0_18/bin> uname -a
Linux hostAddr 2.6.16.60-0.34-smp #1 SMP Fri Jan 16 14:59:01 UTC 2009 x86_64 x86_64 x86_64 GNU/Linux使用以下命令:
jstatd -J-Djava.security.policy=~/jstatd.all.policyjstatd.all.policy内容
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};不幸的是,我得到了以下输出:
Could not create remote object
access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.System.setProperty(System.java:725)
at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)由于某些原因,jstatd使用相同的命令和策略文件在windows上成功运行。
Linux java版本:
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) 64-Bit Server VM (build 16.0-b13, mixed mode)Windows java版本:
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)发布于 2013-02-18 13:41:08
这是对我有效的方法:
jstatd.all.policy中指向tools.jar的URL是正确的,并声明协议(在本例中为文件)。例如,根据java.home变量指向的位置,您可能需要删除路径中的../部分,如下所示(我不得不这样做):grant codebase " file :${java.home}/lib/tools.jar“{ permission java.security.AllPermission;};
-J-Djava.security.policy=/absolute-path-to/jstatd.all.policy -p 12345 jstatd
编辑:在Java1.8中可能不再需要或支持-J参数,因此此命令将改为:
-Djava.security.policy=/absolute-path-to/jstatd.all.policy -p 12345 jstatd
(感谢@lisak指出这个out)
JAVA_OPTS在JBoss run.conf中添加一些java选项(假设您正在监控JBoss实例)。所有这些都在提供的链接中进行了更详细的解释。编辑:-指向具有相同内容的另一个页面的死链接Using VisualVM to monitor a remote JBoss instance。
发布于 2013-03-02 23:29:00
刚刚找到了下面的脚本来运行jstatd。我设法用这个脚本https://gist.github.com/nicerobot/1375032运行了jstatd
#!/bin/sh
policy=${HOME}/.jstatd.all.policy
[ -r ${policy} ] || cat >${policy} <<'POLICY'
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
POLICY
jstatd -J-Djava.security.policy=${policy} &发布于 2016-05-26 22:02:46
使用process substitution的one liner (尽管是bashism):
jstatd -p 1099 -J-Djava.security.policy=<(echo 'grant codebase "file:${java.home}/../lib/tools.jar" {permission java.security.AllPermission;};')包装:
jstatd -p 1099 -J-Djava.security.policy=<(echo 'grant codebase "file:${java.home}/../lib/tools.jar" {permission java.security.AllPermission;};')
从jdk1.8.0_92开始,java启动器选项前缀-J仍然是必需的。
注意:
最初的问题更有可能是由于~/jstatd.all.policy中的代字号~没有扩展,因此java无法理解,同时绝对路径或使用${HOME}都应该可以工作。
https://stackoverflow.com/questions/9939883
复制相似问题