利用VisualVm远程监控Java进程

原文地址html

本文介绍利用VisualVmjstatd来远程监控Java进程的方法。java

要实现远程监控Java进程,必须在远程主机(运行Java程序的主机)上跑一个jstatd进程,这个进程至关于一个agent,用来收集远程主机上的JVM运行状况,而后用VisualVm链接到这个jstatd,从而实现远程监控的目的。git

第一步:在远程主机上启动jstatd

要注意的是,jstatd是一个RMI server application,所以在启动时支持java.rmi propertiesgithub

根据jstatd文档,咱们须要在启动jstatd时提供一个security policy文件:bash

grant codebase "file:${java.home}/../lib/tools.jar" {   
    permission java.security.AllPermission;
};

而后运行下面命令启动:oracle

jstatd -J-Djava.security.policy=jstatd.all.policy

不过这里有一个陷阱,见SO上的这个提问:VisualVm connect to remote jstatd not showing applications。在启动时还得指定rmi server hostname,不然VisualVm没法看到远程主机上的Java进程。因此正确的命令应该是这样:app

jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=<host or ip>

远程主机的hostname能够随便填,只要VisualVm可以ping通这个hostname就好了。因此说下面这几种状况都是可行的:ide

  • 远程主机没有DNS name,但VisualVm所在主机的/etc/hosts里配置了some-name <ip-to-remote-host>。jstatd启动时指定-J-Djava.rmi.server.hostname=some-name,VisualVm链接some-name
  • 远程主机通过层层NAT,它的内部ip好比是192.168.xxx.xxx,它的对外的NAT地址是172.100.xxx.xxx。jstatd启动时指定-J-Djava.rmi.server.hostname=172.100.xxx.xxx,VisualVm链接172.100.xxx.xxx
  • 上面两种方式混合,即在VisualVm所在主机的/etc/hosts里配置some-name <ip-to-remote-host-nat-address>。jstatd启动时指定-J-Djava.rmi.server.hostname=some-name,VisualVm链接some-name

还有要注意一点,运行jstatd的用户必须和运行Java程序的用户相同,或者是root,不然会监控不到远程主机上的Java进程。post

第二步:启动VisualVm

在你的机器上运行jvisualvm启动VisualVm。按照下面步骤添加远程主机:ui

第一步

图片描述

第二步

图片描述

第三步

图片描述

你就能看到远程主机上的Java进程了。

须要注意的是若是你点开一个远程进程,那么你会发现有些信息是没有的,好比:CPU、线程、和MBeans。这是正常的,若是须要这些信息(就像监控本地Java进程同样),那么就须要用JMX,相关内容会在另外一篇文章中讲解。

参考资料

相关文章
相关标签/搜索