JVirtualVM支持通过Remote节点远程监控Java进程。这样可以利用可视化界面非常方便监控生产环境,用于定位Java应用CPU或者内存问题。
VirtualVM连接远程节点有2种方式:jstatd和jmx,下面分别详细讲解。
在远程主机上启动Jstatd,需要先配置权限,否则会报如下security错误:
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:472) at java.security.AccessController.checkPermission(AccessController.java:884) at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) at java.lang.System.setProperty(System.java:792) at sun.tools.jstatd.Jstatd.main(Jstatd.java:139)
因此先在 $JAVA_HOME/bin下
创建一个 jstatd.all.policy
文件。内容如下:
grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };
注意Java9之后的版本不存在文件 tools.jar
,需如下配置:
grant codebase "jrt:/jdk.jstatd" { permission java.security.AllPermission; }; grant codebase "jrt:/jdk.internal.jvmstat" { permission java.security.AllPermission; };
然后在 $JAVA_HOME/bin下
下启动jstatd:
jstatd -J-Djava.security.policy=jstatd.all.policy
在本地JVirtualVM客户端上 Remote
下添加节点:
接下来选择对应的java进程就可以进行监控了。不过jstatd模式下,只能使用简单的Monitor,无法使用Sampler功能。如需Sampler,需使用JMX方式连接。
以下为Monitor截图:
在远程主机启动应用程序的时候增加jmx配置,如下:
java -Djava.rmi.server.hostname=ttg12 -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false HelloWorld
注意:这种不需要验证的方式不安全!只用作测试,均不能用于外网可访问的生产环境!
在VirtualVM客户端增加JMX连接远程主机:
填入主机和端口号,勾选不使用ssl:
OK,现在除了Monitor之外,还可以监控线程和使用Sampler了。
Threads界面如下图:
Sampler界面如下图: