VisualVM工具与Java程序的远程监控

一、VisualVM本地监控

VisualVM是JDK自带的一款全能型性能监控和故障分析工具,包括对CPU使用、JVM堆内存消耗、线程、类加载的实时监控,内存dump文件分析,垃圾回收运行情况的可视化分析等,对故障排查和性能调优很有帮助。

1、启动VisualVM工具

在windows中安装JDK后,VisualVM位于%JAVA_HOME%/bin/下,如下图:

VisualVM工具与Java程序的远程监控_第1张图片

直接双击即可执行jvisualvm.exe,一个主要运行界面如图:

VisualVM工具与Java程序的远程监控_第2张图片

如果本机没有安装JDK,也可以到官方网站下载,地址为:https://visualvm.github.io/  ,当前的最新版本为:2.0

左侧窗口中"本地 "下显示的是在 localhost 运行的 Java 程序的资源占用情况,如果本地有 Java 程序在运行的话启动 Java VisualVM 即可看到相应的程序名,点击程序名打开相应的资源监控菜单,以图形的形式列出程序所占用的 CPU 、 Heap 、 PermGen 、类、线程的统计信息。当本地有java进程启动时,左侧窗口中"本地 "会自动检查到启动的java进程及其进程ID,双击即可查看它的上述统计信息。

2、安装Visual GC插件

当VisualVM启动时会自动检测本机运行中的JVM并与之建立连接,在左侧显示出当前正在运行的java进程及其进程ID。但是VisualVM首次启动时不会带有查看对内存情况的Visual GC选项窗口,不过可通过菜单中的"工具"->“插件”找到插件安装窗口,如下图所示:

VisualVM工具与Java程序的远程监控_第3张图片

在可用插件里找到 Visual GC插件后,点击“安装”按钮,一路下一步并接收协议即可完成安装。安装完成后重启,即可看到已经存在 Visual GC选项窗口了。如下图:

VisualVM工具与Java程序的远程监控_第4张图片

3、[本地]dump线程与堆信息

在左侧窗口列出的java进程上鼠标右键 VisualVM我们可以看到 “线程Dump”, “堆Dump"等功能。该功能只能对本地java程序使用,而远程没有这个功能(目前所知,需要借助jmap和jstack功能生成dump文件后,转存储到本地使用VisualVM或MAT工具来分析)。

VisualVM工具与Java程序的远程监控_第5张图片

(1)线程Dump :当执行线程Dump时很快,马上就可以看到结果:

VisualVM工具与Java程序的远程监控_第6张图片

(2)堆Dump :当执行堆Dump要稍花费一些时间(可以看到当前 heap 里对象的数量及占用的比例,做 OOM 很好用):

VisualVM工具与Java程序的远程监控_第7张图片

二、VisualVM 远程监控

VisualVM连接远程服务器有两种方式:JMX和jstatd,两种方式都不能完美支持所有功能,例如JMX不支持VisualGCjstatd不支持CPU监控,实际使用可同时配置上并按需选用。

(1) JMX(Java Management Extensions,即 Java 管理扩展)。

(2) jstatd是一个基于RMI(Remove Method Invocation)的服务程序,它用于监控基于HotSpot的JVM中资源的创建及销毁,并且提供了一个远程接口允许远程的监控工具连接到本地的JVM执行命令。

三、JMX方式监控

1、服务端JMX的配置

JMX配置方式要求Java程序在启动时配置JMX相关参数,而java程序开启JMX很简单,只要在 启动Java程序的命令后面指定如下命令即可:

-Djava.rmi.server.hostname=172.17.207.152
-Dcom.sun.management.jmxremote.port=7080
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

参数说明:

  • hostname:远程主机的IP地址(可在远程主机centos上使用命令: ip a 获取到);
  • port:开启JMX监控的服务端口号;
  • ssl:指定JMX是否开启ssl
  • authenticate:表示是否需要密码认证(需要用户名,密码鉴权),通常为false。

上述authenticate如果赋值为true,则会使用jmxremote.password设置的密码。 设置的方式如下:

(1)进入到${jre.home}/lib/management下,通过jmxremote.password.template模板文件复制出一份jmxremote.password文件来:

cp -r jmxremote.password.template jmxremote.password

(2)打开jmxremote.password,修改,添加用户或密码,建议不要使用默认的用户名和密码登录:

monitorRole   222
jmxuser   111111
newuser   222222

(3)打开jmxremote.access,修改新加/修改的用户权限

monitorRole   readonly
jmxuser       readwrite \
              create javax.management.monitor.*,javax.management.timer.* \
              unregister
newuser       readwrite \
              create javax.management.monitor.*,javax.management.timer.* \
              unregister

注意:记得设置jmxremote.password和jmxremote.access文件的权限改为这个用户的只读权限

 

2、使用VisualVM连接JMX服务端

当配置并启动一个JMX服务端java程序后,即可使用VisualVM客户端连接查看了。通过左侧菜单:”远程“右键添加服务器的IP地址后,在IP地址子菜单上,右键“添加JMX连接”按照下图所示配置端口号即可。如果配置了鉴权认证,需要在下面输入用户名和口令。

VisualVM工具与Java程序的远程监控_第8张图片

3、使用java的API连接JMX 服务端

import java.util.HashMap;
import java.util.Map;
import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class TestJMXClient {

	public static void main(String[] args) {
		try {
			String jndiPath = "jmxrmi";
			String serverhost = "172.17.207.152";
			String serverport = "7080";
			// url=service:jmx:rmi:///jndi/rmi://172.17.207.152:7080/jmxrmi
			String jmxurl = "service:jmx:rmi:///jndi/rmi://" + serverhost + ":" + serverport + "/" + jndiPath;
			System.out.println("jmxurl:" + jmxurl);
			JMXServiceURL url = new JMXServiceURL(jmxurl);
			Map enviMap = new HashMap();

			JMXConnector connector = JMXConnectorFactory.connect(url, enviMap);
			MBeanServerConnection mbsc = connector.getMBeanServerConnection();
			Integer count = mbsc.getMBeanCount();
			System.out.println("successful connected ,and mbean count=" + count);
			connector.close();
			System.out.println("close connect");
		} catch (Exception e) {
			System.out.println("error:");
			e.printStackTrace();
		}
	}
}

与JMX相关的java编程资料:

(1)JMX之MBean : https://blog.csdn.net/hobby_rain/article/details/80289804

(2)MBean集成知识:https://blog.csdn.net/wusandi/article/details/78170293

(3)JDK中文文档:https://tool.oschina.net/uploads/apidocs/jdk-zh/index.html

4、使用jdk自带的jconsole工具连接JMX 服务端

首先在jdk的按照目录下找到jconsole工具,如下图:

VisualVM工具与Java程序的远程监控_第9张图片

然后双击运行,输入JMX的服务端IP和端口号后,即可进入远程实时监控界面:

VisualVM工具与Java程序的远程监控_第10张图片

VisualVM工具与Java程序的远程监控_第11张图片

三、jstatd方式监控

1、服务端jstatd配置

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

在启动jstatd时提供一个security policy文件,这里设置文件名为jstatd.all.policy,内容如下:

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

即:

VisualVM工具与Java程序的远程监控_第12张图片

然后使用如下命令启动jstatd进程:

nohup jstatd -J-Djava.security.policy=./jstatd.all.policy -J-Djava.rmi.server.hostname=172.17.207.152 -p 1090 &

参数说明:

  • -J-Djava.security.policy=file指定策略配置文件
  • -J-Djava.rmi.server.hostname=172.17.207.152指定服务器监听的IP地址。
  • -p number:指定开启的服务端口号,不指定默认为1099;
  • -n rminame :指定服务对象的名称,默认为JStatRemoteHost;如果同一台主机上同时运行了多个jstatd服务,rminame可以用于唯一确定一个jstatd服务;

建议:最好-J-Djava.rmi.server.hostname参数指定监听的服务器IP地址,否则在使用VisualVM客户端连接时有时连接不上,网上据说为如下原因:需要把下面查询出的这个 127.0.0.1 修改成本机 ip 地址。

VisualVM工具与Java程序的远程监控_第13张图片

 

2、使用VisualVM连接服务端jstatd

当在服务器上配置并启动jstatd进程后,即可使用VisualVM客户端连接查看了。通过左侧菜单:”远程“右键添加服务器的IP地址后,在IP地址子菜单上,右键“添加jstatd连接”按照下图所示配置端口号即可。

VisualVM工具与Java程序的远程监控_第14张图片

 

四、使用VisualVM进行调优分析

(1)参考:https://blog.csdn.net/hrbeuwhw/article/details/79477282

 

你可能感兴趣的:(JAVA)