Java性能监控工具:VisualVM

VisualVM是JDK自带的一款全能型性能监控和故障分析工具,包括对CPU使用、JVM堆内存消耗、线程、类加载的实时监控,内存dump文件分析,垃圾回收运行状况的可视化分析等,对故障排查和性能调优颇有帮助。在windows中安装JDK后,VisualVM位于%JAVA_HOME%/bin/下,直接执行jvisualvm.exe便可。java

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

双击启动 Java VisualVM 后能够看到窗口左侧 "应用程序 "栏中有" 本地 "、"远程 " 、"快照 "三个项目。tomcat

 "本地 "下显示的是在 localhost 运行的 Java 程序的资源占用状况,若是本地有 Java 程序在运行的话启动 Java VisualVM 便可看到相应的程序名,点击程序名打开相应的资源监控菜单,以图形的形式列出程序所占用的 CPU 、 Heap 、 PermGen 、类、线程的 统计信息。安全

"远程" 项下列出的远程主机上的 Java 程序的资源占用状况,但须要在远程主机上运行 jstatd 守护程序服务器

VisualVM分为 3 类, 本地 它会自动侦测到,并显示出来.工具

如今启动IDEA.性能

双击Local 下的任一节点,看到右边的变化 ,你能够监控 CPU ,内存,类,线程等运行情况,实时监控服务器性能。spa

 

 右键 VisualVM咱们能够看到 Thread Dump, Heap Dump线程

 作 Thread Dump 很快,立刻就能够看到结果code

 

 

 Heap Dump要稍花费一些时间(能够看到当前 heap 里对象的数量及占用的比例,作 OOM 很好用)

 

二.使用visualvm 远程监控 JVM  

 1. 在服务器上安装 jstatd 组件

jstatd工具是一个RMI服务器应用程序,主要用于监控HotSpot Java 虚拟机的建立与终止,并提供一个接口以容许远程监控工具附加到本地主机上运行的JVM上。

使用apt-get 命令安装 openjdk 便可 :

sudo apt-get install openjdk-6-jdk

2.在服务器上配置 jstatd 的 security policy 文件

jstatd是一个监控 JVM 从建立到销毁过程当中资源占用状况并提供远程监控接口的 RMI ( Remote Method Invocation ,远程方法调用)服务器程序,它是一个 Daemon 程序,要保证远程监控软件链接到本地的话须要 jstatd 始终保持运行。 

jstatd运行须要经过 -J-Djava.security.policy=*** 指定安全策略,所以咱们须要在服务器上创建一个指定安全策略的文件jstatd.all.policy ,在JAVA_HOME/bin目录下建立jstatd.all.policy文件内容以下:

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

3. 修改服务器 hosts 文件中的 IP 地址

要使Java VisualVM 成功链接到远程服务器上,服务器端应该在 /etc/hosts 文件中把本机地址设为本机的 IP 地址。使用 hostname -i 命令查看,若是显示的是 127.0.0.1 或者与本机实际 IP 不一致的话,须要把 /etc/hosts 文件中相应的地址改成本机实际 IP 。

我使用的Linux,使用hostname -i 查看ip是否为本身的外网IP(若是你仅仅是内网,是内网的IP,但不能是127.0.0.1或者localhost)

# localhost是本地环回地址,lack为机器名,将localhost修改成对应ip
# 如:10.10.23.10 lack
localhost lack

4.运行 jstatd 守护程序

 jstatd 须要保持一直运行,执行 jstatd 程序,命令以下:(注意:要在JAVA_HOME/bin目录下运行该命令)

jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.1.208&

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

netstat -anp | grep *jstatd 查看jstatd 所用的端口,防火墙开端口号

 

5.经过Java VisualVM 链接到服务器监控 Java 程序

在Java VisualVM 程序窗口左侧 " 远程 " 项目右键选择 " 添加远程主机 " ,在弹出的对话框中输入远程主机的 IP 地址,确认提交后便可看到相应的远程主机和在上面运行的 Java 程序,链接成功后应该会显示 Jstatd 及其 PID 。

右击远程 选择添加远程主机:

若是从新指定了jstatd端口,选择高级设置修改端口,以下图:默认端口为1099  

 

添加后如图所示: 

 

三:Tomcat配置JMX 

用hostname -i 查看是否为127.0.0.1,这步很是重要,不然会链接失败,若是是,必需要配置-Djava.rmi.server.hostname 好比个人配置为 -Djava.rmi.server.hostname=192.168.8.7,而不须要修改hosts文件,修改此文件还可能影响到其余程序。 
只须要在TOMCAT_HOME/bin/找到catalina.sh 加上如下参数,从新启动tomcat就能够了: 

JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=192.168.8.7  
-Dcom.sun.management.jmxremote.port=8088  
-Dcom.sun.management.jmxremote.ssl=false  
-Dcom.sun.management.jmxremote.authenticate=false"

注:1. -Dcom.sun.management.jmxremote.port :这个是配置远程 connection 的端口号的,要肯定这个端口没有被占用

2. -Dcom.sun.management.jmxremote.ssl=false 指定了 JMX 是否启用 ssl

3. -Dcom.sun.management.jmxremote.authenticate=false   指定了JMX 是否启用鉴权(须要用户名,密码鉴权)

   2,3两个是固定配置,是 JMX 的远程服务权限的

4. -Djava.rmi.server.hostname :这个是配置 server 的 IP 的

打开JAVA_HOME/bin/下的jvisualvm 或者jconsole 的工具能够直接链接了,以下图visualvm链接的示意图: 

 

 

 

不使用ssl就勾选最后一个“不要求ssl链接”,由于没有身份证,因此也不勾选使用安全凭证。可是若是链接的是公网上的Tomcat,那么就要注意安全性了,接下来看看使用用户名和密码链接

依然是在catalina.sh里面,设置JAVA_OPTS

JAVA_OPTS='-Xms128m -Xmx256m -XX:MaxPermSize=128m
        -Djava.rmi.server.hostname=10.10.23.10
        -Dcom.sun.management.jmxremote.port=9999
        -Dcom.sun.management.jmxremote.ssl=false
        -Dcom.sun.management.jmxremote.authenticate=true
        -Dcom.sun.management.jmxremote.password.file=/usr/java/default/jre/lib/management/jmxremote.password
        -Dcom.sun.management.jmxremote.access.file=/usr/java/default/jre/lib/management/jmxremote.access'
/usr/java/default/jre/lib/management/jmxremote.password和/usr/java/default/jre/lib/management/jmxremote.access是两个文件(在JAVA_HOME\jre\lib\management下有模板),如下分别编辑两个文件
# /usr/java/default/jre/lib/management/jmxremote.password
#(12345六、123456789为密码)
monitorRole 123456 
controlRole 123456789
# /usr/java/default/jre/lib/management/jmxremote.access
monitorRole   readonly
controlRole   readwrite

新建完成这两个文件要修改jmxremote.password的权限

chmod 600 jmxremote.password

接下来就能够远程链接了

相关文章
相关标签/搜索