乐趣区

Java-VirtualVM远程监控Java应用性能

JVirtualVM 支持通过 Remote 节点远程监控 Java 进程。这样可以利用可视化界面非常方便监控生产环境,用于定位 Java 应用 CPU 或者内存问题。

VirtualVM 连接远程节点有 2 种方式:jstatd 和 jmx,下面分别详细讲解。

一、Jstatd 连接方式

在远程主机上启动 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 连接方式

在远程主机启动应用程序的时候增加 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 界面如下图:

退出移动版