jstatd jvisualvm 远程监控jvm

参考:http://sjsky.iteye.com/blog/705323

jstatd [options]

此命令是一个RMI Server应用程序,提供了对JVM的创建和结束监视,也为远程监视工具提供了一个可以attach的接口

options 
-nr 当一个存在的RMI Registry没有找到时,不尝试创建一个内部的RMI Registry
-p port 端口号,默认为1099
-n rminame 默认为JStatRemoteHost;如果多个jstatd服务开始在同一台主机上,rminame唯一确定一个jstatd服务
-J jvm选项

jstatd
会报如下错误:
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:727)
        at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)

这是因为没有给jstatd指定安全策略

创建安全策略文件,并命名为jstatd.all.policy
grant codebase "file:${java.home}/../lib/tools.jar" {
    permission java.security.AllPermission;
};

注:${java.home} 被识别为当前jstatd的目录,即使系统指定JAVA_HOME,$JAVA_HOME也不能被识别。。。或者直接使用绝对路径。jstatd.all.policy可以放在任何位置,运行时需要指定绝对路径。

再次启动(默认端口1099
jstatd -J-Djava.security.policy=jstatd.all.policy

(jstatd -J-Djava.security.policy=jstatd.all.policy &   可以后台运行)

就可以通过jvisualvm连接了。注 同时需要执行一个命令查看本机对外ip(linux需要)Hostname –i

如果显示是127.0.0.1或者其他ip,与对外ip不同,则需要修改/etc/hosts文件,去掉对本机名的配置,让本机名解析到它的IP地址,如10.20.131.214。(或者在启动的时候使用jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=10.20.131.214 & 启动,这样不需要修改hosts文件,因为修改此文件还可能影响到其他程序。 

然后在jvisualvm中通过Add Remote Host添加10.20.131.214来访问


更多示例 :
1)使用内部RMI Registry
jstatd -J-Djava.security.policy=jstatd.all.policy  (默认端口为1099) 
2)使用外部RMI Registry
a)使用默认值
rmiregistry&
jstatd -J-Djava.security.policy=jstatd.all.policy
b)使用2020端口
rmiregistry 2020&
jstatd -J-Djava.security.policy=all.policy -p 2020 
c)使用2020端口,使用rminame
rmiregistry 2020&
jstatd -J-Djava.security.policy=jstatd.all.policy -p 2020 -n AlternateJstatdServerName
3RMI Registry已经启动,不创建内部RMI Registry
jstatd -J-Djava.security.policy=jstatd.all.policy -nr
4RMI日志能力
jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.logCalls=true


你可能感兴趣的:(jvm,c,linux,工具)