我尝试在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
Run Code Online (Sandbox Code Playgroud)
使用以下命令:
jstatd -J-Djava.security.policy=~/jstatd.all.policy
Run Code Online (Sandbox Code Playgroud)
jstatd.all.policy内容
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
Run Code Online (Sandbox Code Playgroud)
不幸的是我得到以下输出:
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)
Run Code Online (Sandbox Code Playgroud)
出于某种原因,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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
mic*_*nko 65
刚刚找到以下脚本运行jstatd.我设法jstatd使用此脚本
运行https://gist.github.com/nicerobot/1375032
#!/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} &
Run Code Online (Sandbox Code Playgroud)
Lig*_*Dye 57
这对我有用:
确保tools.jar文件存在,并且运行jstatd命令的用户具有读取它的权限.
确保jstatd.all.policy指向tools.jar 的URL 正确并声明协议(在本例中为文件).例如,根据java.home变量指向的位置,您可能需要删除../路径中的部分,就像这样(我不得不):
grant codebase "file:${java.home}/lib/tools.jar" {
permission java.security.AllPermission;
};
Run Code Online (Sandbox Code Playgroud)从Java 1.4开始,策略文件需要以UTF-8编码而不需要BOM.EOL(CRLF vs LF)应该不重要.请参阅Oracle的"默认策略实施和策略文件语法"文档,在"更改"部分下获取更多信息(链接未提供,因为我没有足够的信誉点来发布超过2个链接,但我确定你'能够找到该文件).
运行jstatd命令时,请使用策略文件的绝对路径,例如
jstatd -p 12345 -J-Djava.security.policy=/absolute-path-to/jstatd.all.policy
Run Code Online (Sandbox Code Playgroud)
编辑:-JJava 1.8中可能不再需要或支持该参数,因此该命令将改为:
jstatd -p 12345 -Djava.security.policy=/absolute-path-to/jstatd.all.policy
Run Code Online (Sandbox Code Playgroud)
(感谢@lisak指出这一点)
最后,一旦你通过这一点,你可能会发现其他问题(我做了),这些帖子指出了我正确的方向:使用VisualVM监视远程JBoss实例和使用VisualVM的JBoss远程概要分析.基本上,你可能需要使用-p参数来使用不同的端口,如果1099已在使用,并添加了JBoss一些Java选项run.conf通过JAVA_OPTS(假设您正在监控的JBoss实例).所有链接中都有更详细的解释.
编辑: - 指向死链接使用VisualVM将远程JBoss实例监视到具有相同内容的另一个页面.
rye*_*nus 17
使用过程替换的一个班轮(虽然是bashism):
jstatd -p 1099 -J-Djava.security.policy=<(echo 'grant codebase "file:${java.home}/../lib/tools.jar" {permission java.security.AllPermission;};')
Run Code Online (Sandbox Code Playgroud)
包裹:
jstatd -p 1099 -J-Djava.security.policy=<(echo 'grant codebase "file:${java.home}/../lib/tools.jar" {permission java.security.AllPermission;};')
从那时起jdk1.8.0_92,-J仍然需要java启动器选项前缀.
原始问题更可能是由于波浪线~,因为~/jstatd.all.policy没有扩展因此不被java理解,同时绝对路径或使用${HOME}相反应该起作用.
| 归档时间: |
|
| 查看次数: |
57832 次 |
| 最近记录: |