1. 本机安装好Visual VM, 并安装好相关插件
2. tomcat中开启jmx支持
catalina.sh
JAVA_OPTS="-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=开放给jmx使用的端口.如:9004
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.net.preferIPv4Stack=true
-Djava.rmi.server.hostname=自己远程服务器ip(如:192.168.2.116)"
-Dcom.sun.management.jmxremote.authenticate=false 表示是否启用鉴权
如果启用了鉴权(值为true), 则还需要指定 access.file
文件 和 password.file
文件. 文件名随意
access.file
的内容为:
monitorRole readonly
controlRole readwrite
password.file
的内容为:
monitorRole tomcat
controlRole tomcat
鉴权配置可参考:
http://blog.csdn.net/bjnihao/article/details/51546492
http://blog.51cto.com/aiilive/1730136
启用鉴权的配置:
JAVA_OPTS="
-Djava.rmi.server.hostname=192.168.88.29
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8089
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password
-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access"
-Dcom.sun.management.jmxremote.password.file
用于指定 password.file
文件位置
-Dcom.sun.management.jmxremote.access.file
用于指定 access.file
文件位置
-Djava.net.preferIPv4Stack=true 标识IP V4优先
-Dcom.sun.management.jmxremote.ssl=false 表示是否启用SSL连接
到这一步如果不使用Visual GC的功能,就可以停止了,如果需要使用Visual GC的功能,则还需要加入Jstatd的配置
3. 编辑 $JAVA_HOME/jre/lib/security/java.policy 文件
原始内容大概是这样:
grant codeBase "file:${{java.ext.dirs}}/*" {
permission java.security.AllPermission;
};
grant {
permission java.lang.RuntimePermission "stopThread";
permission java.util.PropertyPermission "java.version", "read";
permission java.util.PropertyPermission "java.vendor", "read";
...省略...
permission java.util.PropertyPermission "java.vm.vendor", "read";
permission java.util.PropertyPermission "java.vm.name", "read";
}
在 grant 块里面加入配置 permission java.security.AllPermission;
最终结果大概这样: 注意最后添加的那一句
grant codeBase "file:${{java.ext.dirs}}/*" {
permission java.security.AllPermission;
};
grant {
permission java.lang.RuntimePermission "stopThread";
permission java.util.PropertyPermission "java.version", "read";
permission java.util.PropertyPermission "java.vendor", "read";
...省略...
permission java.util.PropertyPermission "java.vm.vendor", "read";
permission java.util.PropertyPermission "java.vm.name", "read";
permission java.security.AllPermission;
}
4. 启动jstatd
cd $JAVA_HOME/bin
jstatd -J-Djava.security.policy=all.policy & -p 10003(指定一个未占用端口) &
5. 查看jstatd占用的端口
netstat -anp | grep jstatd
如果启用了防火墙, 记得开放这个端口.
p.s. 这里还要注意一点就是,jstatd实际上会启动两个端口, 一个是在4步骤中配置的 -p 10003这个自定义端口, 还会随机启动另外一个端口, 这个端口,也要让防火墙开放(注意:这个端口每次重启都会改变,因为这是个随机端口)
网友评论