HotSpot JVM 监控

来源:互联网 发布:wr886n设置访客网络 编辑:程序博客网 时间:2024/04/29 23:29

摘要: 

               HotSpot  JVM 监控可分为可视化监控和字符界面监控两大类.其中,可视化监控主要VisualVm和JConsole,用的较多的还是VisualVm;字符界面监控是根本,可视化监控都是从字符界面做起的,主要采用jps/jstat/jinfo等进行监控。上述都是Sun JDK 中自带的。下文主要是介绍VisualVm的使用。

            visualvm简要说明

        VisualVm 在JDK1.6 update 7 中首次出现,具有很强的向下兼容能力,能向下兼容1.4.2平台,但并非所有的功能都能完美的向下兼容。它是基于NetBeans平台开发的,支持插件扩展。目前官方http://visualvm.java.net/ 最新版本是1.3.5。

       

创建jvisualvm.exe的快捷方式,右键快捷方式选择属性,在“目标”栏中追加"-XX:+PerfBypassFileSystemCheck"

程序运行后会自动监控本机运行的java程序(Local标签下,远程服务器上的java程序需要另行配置),如果是下载的visualvm,解压后,运行bin目录下的visualvm.exe即可

Local标签下的第一个VisualVM为visualvm对自身的监控,消耗的资源还是很少的

第二个为本机的eclipse

 

监控项如图,visual GC 是我装的插件。

    


        监控服务器上的tomcat

tomcat的配置文件catalina.sh中增加:

[plain] view plaincopy
  1. JAVA_OPTS="-Dcom.sun.management.jmxremote.port=9998   
  2.     -Dcom.sun.management.jmxremote.ssl=false   
  3.     -Dcom.sun.management.jmxremote.authenticate=false   
  4.     -Djava.rmi.server.hostname=192.168.58.164"  

参数说明:

[plain] view plaincopy
  1. 指定了JMX启动的代理端口,这个端口就是visualvm要连接的端口(9998端口不能被别的程序使用netstat -an|gerp 9998)  
  2. Dcom.sun.management.jmxremote.port=9998  
  3. 指定了JMX是否启用ssl  
  4. Dcom.sun.management.jmxremote.authenticate=false  
  5. 指定了JMX是否启用鉴权(需要用户名,密码鉴权)  
  6. Dcom.sun.management.jmxremote.authenticate=false  
  7. 指定了服务器主机名  
  8. Djava.rmi.server.hostname=192.168.58.164  

填写主机名:

右键创建一个jmx连接:

填写上端口号即可:


配置完成:



监控服务器上的java程序

相较于监控tomcat要麻烦很多,要预先启动jstatd服务(${java_home}/bin目录下)


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

jstatd运行需要通过-J-Djava.security.policy=***指定安全策略,因此我们需要在服务器上建立一个指定安全策略的文件jstatd.all.policy(我放在了${java_home}/bin目录下),文件内容如下:

[plain] view plaincopy
  1. grant codebase "file:/home/123/123/jdk1.5.0_15/lib/tools.jar" {   
  2.     permission java.security.AllPermission;   
  3. };   

然后使用这个策略文件启动jstatd服务

[plain] view plaincopy
  1. [123@123 bin]$ pwd  
  2. /home/123/123/jdk1.5.0_15/bin  
  3. [123@123 bin]$ ./jstatd -J-Djava.security.policy=./jstatd.all.policy &  

因为监控的过程中需要jstatd服务一直运行,所以加上了&,如果需要日志也可使用:


[plain]
 view plaincopy
  1. ./jstatd -J-Djava.security.policy=./jstatd.all.policy -J-Djava.rmi.server.logCalls=true  

接下来就可以在visualvm中配置监控该服务器上运行的java程序了,和在visualvm中配置监控tomcat服务器的操作过程是一样的

需要特别注意的是,有时在配置远程监控java程序的时候visualvm会报一个错误

点击查看错误详情:

 

connection refused to host:127.0.0.1初步判断和主机名有关系

[plain] view plaincopy
  1. [123@123 bin]# hostname -i  
  2. 127.0.0.1  
[plain] view plaincopy
  1. [123@123 bin]# hostname 192.168.58.168  

修改完重启jstatd服务(网上很多人说要修改主机的/etc/hosts文件,但是我自己测试修改/etc/hosts文件是没有效果的,必须要修改主机名

填写主机名:

 这里要选添加一个jstatd连接:

直接选择默认配置即可(默认使用1099端口):

点击ok后,168上的所有java程序就会自动列出:






     


           


          后记:

          (1)VisualVm 1.3.5  下载到本地后,解压,找到visualvm_135\bin,运行,报cannot find java 1.6 or higher,可找到VisalVM安装目录 /etc/visualvm.conf 文件,将其中的 jdkhome 注释打开,并配置上本机JDK绝对路径即可,如visualvm_jdkhome="D:/Software/Develop/jdk1.6.0_171"。而且,随JDK发布的VisualVm不能更新插件,推荐用1.3.5。

        (2)  VisualVm 1.3.5  不必在创建jvisualvm.exe的快捷方式“目标”栏中追加"-XX:+PerfBypassFileSystemCheck" ,就可实现本地监控。  

        (3) Eclipse 修改JVM参数的简便方法:修改配置文件eclipse.ini。还是那句话,可视化的背后一定是某种属性配置,文件,数据库。。。

                

                    (4) 开通jstad后,便会列出所有java程序,包括tomcat,所以,我觉得,倒是直接开通远程服务来的方便,包括在字符监控时,也需要开通jstd。

                    (5) 字符监控常用命令:

jps命令,查看本机器所有Java进程vmid
jps -l
 
jstat命令,跟踪某一Java进程GC运行情况
jstat -gcutil [vmid] 2000    (每2秒刷新一次)
 
jmap命令,强制Java进程生成当前堆快照(dump文件)
jmap -dump:format=b,file=c:/xxx.bin [vmid]
 
jstack命令,生成虚拟机当前线程快照
jstack -l [vmid] > c:/xxx.txt

      上述内容主要转载自:http://blog.csdn.net/a19881029/article/details/8432368