利用VisualVm远程监控Java进程

分为启动jstatd和启动JMX两部分

一、在远程主机上启动jstatd

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

注意VisualVM的下载地址,从github下载

1、需要在启动jstatd时提供一个security policy文件,新建文件jstatd.all.policy,文件内容如下:

grant codebase "file:/usr/lib/jvm/java-1.8.0-openjdk-amd64/lib/tools.jar" {  
    permission java.security.AllPermission;  
};

说明:根据本机配置修改java安装路径

2、然后运行下面命令启动: 

jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.1.105 -J-Djava.rmi.server.logCalls=true 

说明:

1)IP地址为远程访问该主机使用的地址,如果主机在阿里云且有内网、外网两个IP地址,则此处使用外网IP地址

2)运行该命令后,会打开2个端口,使用 命令netstat -lpnt|grep jstatd可查看到所打开端口,需要在防火墙上配置外网可访问该端口,其中1099位固定打开的端口,另外一个端口为随机打开,每次都要在防火墙上配置该端口

3)-J-Djava.rmi.server.logCalls=true 为输出日志,可不用该参数

3、配置VisualVM

打开VisualVM,右键点击Remote,选择Add Remote Host

利用VisualVm远程监控Java进程

利用VisualVm远程监控Java进程

利用VisualVm远程监控Java进程

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

需要注意的是如果你点开一个远程进程,那么你会发现有些信息是没有的,比如:CPU、线程、和MBeans。这是正常的,如果需要这些信息(就像监控本地Java进程一样),那么就需要用JMX

二、配置JMX

1、服务端配置命令

java -Xms8000m -Xmx14000m -Djava.rmi.server.hostname=192.168.1.105 -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.rmi.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar netty-test-0.0.1-SNAPSHOT.jar

关键部分已标红,说明:

1) IP地址为远程访问该主机使用的地址,如果主机在阿里云且有内网、外网两个IP地址,则此处使用外网IP地址

2)9999为端口,需要在防火墙配置可访问到该端口

2、配置visualVM

IP地址上点击右键,选择Add JMX Connection

利用VisualVm远程监控Java进程

输入端口9999

利用VisualVm远程监控Java进程

利用VisualVm远程监控Java进程

此时可访问完整的CPU、Threads、Memory等信息