VisualVM是JDK自带的一款全能型性能监控和故障分析工具,包括对CPU使用、JVM堆内存消耗、线程、类加载的实时监控,内存dump文件分析,垃圾回收运行情况的可视化分析等,对故障排查和性能调优很有帮助。
在windows中安装JDK后,VisualVM位于%JAVA_HOME%/bin/下,如下图:
直接双击即可执行jvisualvm.exe,一个主要运行界面如图:
如果本机没有安装JDK,也可以到官方网站下载,地址为:https://visualvm.github.io/ ,当前的最新版本为:2.0
左侧窗口中"本地 "下显示的是在 localhost 运行的 Java 程序的资源占用情况,如果本地有 Java 程序在运行的话启动 Java VisualVM 即可看到相应的程序名,点击程序名打开相应的资源监控菜单,以图形的形式列出程序所占用的 CPU 、 Heap 、 PermGen 、类、线程的统计信息。当本地有java进程启动时,左侧窗口中"本地 "会自动检查到启动的java进程及其进程ID,双击即可查看它的上述统计信息。
当VisualVM启动时会自动检测本机运行中的JVM并与之建立连接,在左侧显示出当前正在运行的java进程及其进程ID。但是VisualVM首次启动时不会带有查看对内存情况的Visual GC选项窗口,不过可通过菜单中的"工具"->“插件”找到插件安装窗口,如下图所示:
在可用插件里找到 Visual GC插件后,点击“安装”按钮,一路下一步并接收协议即可完成安装。安装完成后重启,即可看到已经存在 Visual GC选项窗口了。如下图:
在左侧窗口列出的java进程上鼠标右键 VisualVM我们可以看到 “线程Dump”, “堆Dump"等功能。该功能只能对本地java程序使用,而远程没有这个功能(目前所知,需要借助jmap和jstack功能生成dump文件后,转存储到本地使用VisualVM或MAT工具来分析)。
(1)线程Dump :当执行线程Dump时很快,马上就可以看到结果:
(2)堆Dump :当执行堆Dump要稍花费一些时间(可以看到当前 heap 里对象的数量及占用的比例,做 OOM 很好用):
VisualVM连接远程服务器有两种方式:JMX和jstatd,两种方式都不能完美支持所有功能,例如JMX不支持VisualGC,jstatd不支持CPU监控,实际使用可同时配置上并按需选用。
(1) JMX(Java Management Extensions,即 Java 管理扩展)。
(2) jstatd是一个基于RMI(Remove Method Invocation)的服务程序,它用于监控基于HotSpot的JVM中资源的创建及销毁,并且提供了一个远程接口允许远程的监控工具连接到本地的JVM执行命令。
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
参数说明:
上述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文件的权限改为这个用户的只读权限
当配置并启动一个JMX服务端java程序后,即可使用VisualVM客户端连接查看了。通过左侧菜单:”远程“右键添加服务器的IP地址后,在IP地址子菜单上,右键“添加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
首先在jdk的按照目录下找到jconsole工具,如下图:
然后双击运行,输入JMX的服务端IP和端口号后,即可进入远程实时监控界面:
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;
};
即:
然后使用如下命令启动jstatd进程:
nohup jstatd -J-Djava.security.policy=./jstatd.all.policy -J-Djava.rmi.server.hostname=172.17.207.152 -p 1090 &
参数说明:
建议:最好-J-Djava.rmi.server.hostname参数指定监听的服务器IP地址,否则在使用VisualVM客户端连接时有时连接不上,网上据说为如下原因:需要把下面查询出的这个 127.0.0.1 修改成本机 ip 地址。
当在服务器上配置并启动jstatd进程后,即可使用VisualVM客户端连接查看了。通过左侧菜单:”远程“右键添加服务器的IP地址后,在IP地址子菜单上,右键“添加jstatd连接”按照下图所示配置端口号即可。
(1)参考:https://blog.csdn.net/hrbeuwhw/article/details/79477282