• visualvm监控jvm及远程jvm监控方法(转)


     VisualVM是Sun的一个OpenJDK项目,其目的在于为Java应用创建一个整套的问题解决工具。它集成了多个JDK命令工具的一个可视化工具,它主要用来监控JVM的运行情况,可以用它来查看和浏览Heap Dump、Thread Dump、内存对象实例情况、GC执行情况、CPU消耗以及类的装载情况。 Java开发人员可以使用 VisualVM创建必要信息的日志,系统管理人员可用来监控及控制Java应用程序在网络中的运行状况。 
       下载页面 : https://visualvm.dev.java.net/download.html

        文档地址 : https://visualvm.dev.java.net/docindex.html

        入门文档 : https://visualvm.dev.java.net/zh_CN/gettingstarted.html

        


        安装插件
        通过安装 VisualVM 更新中心提供的插件,可以向 VisualVM 添加功能。
        1. 从主菜单中选择“工具”>“插件”。
        2. 在“可用插件”标签中,选中该插件的“安装”复选框。单击“安装”。
        3. 逐步完成插件安装程序。
        


        功能    
        1. 概述
            查看jvm信息及系统配置
        

        2. 监视
            了解项目运动的概况
        

        3. visual gc
            可以看到内存gc的详细情况
            


        远程监控    
        1. 通过jstatd启动RMI服务
            配置java安全访问,将如下的代码存为文件 jstatd.all.policy,放到JAVA_HOME/bin中,其内容如下,
            grant codebase "file:${java.home}/../lib/tools.jar" {

                   permission java.security.AllPermission;

              };
                
              执行命令jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.1.8 &(192.168.1.8  为你服务器的ip地址,&表示用守护线程的方式运行)
              jstatd命令详解 :http://hzl7652.iteye.com/blog/1183182 
             
              打开jvisualvm, 右键Remort,选择 "Add Remort Host...",在弹出框中输入你的远端IP,比如192.168.1.8. 连接成功.
        
        2. 配置JMX管理tomcat
            打开Tomcat的bin/catalina.bat,如果为linux或unix系统,则为catalina.sh文件 。 
               无限制访问 
               

      set JAVA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote.authenticate=false -    Dcom.sun.management.jmxremote.ssl=false 

    需要用户名和密码访问
     
            JAVA_OPTS='-Xms128m -Xmx256m -XX:MaxPermSize=128m
            -Djava.rmi.server.hostname=192.168.1.8
            -Dcom.sun.management.jmxremote.port=8088
            -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'
     
     

              (jmxremote.access 在JAVA_HOMEjrelibmanagement下有模板)
             jmxremote.access 中显示
             monitorRole   readonly

             controlRole   readwrite

            
            jmxremote.password中显示
            monitorRole  QED            (QED为密码)

            controlRole   R&D

            重新在visualvm中打开远程tomcat就可以使用JMX带来的功能了
     
     
    从左边Applications树中可以知道,不光可以监控本地JVM运行情况, 还可以监控远程机器上的JVM运行情况.
    本地监控:只要打开某个JAVA程序就会自动的加入到本地监控中.

    因为本地监控无需配置, 所以这里主要介绍监控远程JVM
    要进行远程监控, 本机的VisualVM就必须和远程的JVM要进行通信, Visualvm目前支持两种remote connection方式.
    分别是jstatd和JMX方式: 这里我主要介绍的是通过JMX方式.

    通过JMX连接远程机器, 需要经过下面的配置:
    1. 修改远程机器JDK配置文件 (我这里远程机器是linux).
       a.进入JAVA_HOMEjrelibmanagement目录
       b.拷贝jmxremote.password.template这个文件到当前目录, 并改名为jmxremote.password
         c.打开jmxremote.password文件,去掉 # monitorRole  QED 和 # controlRole  R&D 这两行前面的注释符号

    2. 修改远程机器上需要被监控的程序的配置文件 (我这里是监控Tomcat容器内部署的应用).
       a.进入TOMCAT_HOMEin目录
         b.打开catalina.sh文件,加入如下信息:
            JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=192.168.0.237
                                                         -Dcom.sun.management.jmxremote.port=18999
                                                         -Dcom.sun.management.jmxremote.ssl=false 
                                                         -Dcom.sun.management.jmxremote.authenticate=false"
       c.重启Tomcat服务.

    3. 客户端VisualVM配置 (我客户端用的是WinXP).
         a.直接反键点击Remote,选择Add Remote Host...
         b.在弹出的界面中输入远程机器的IP地址(192.168.0.237),这个IP地址会加入到Remote节点下.
         c.反键点击这个IP地址,选择Add JMX Connection, 在弹出的界面中输入刚配置的端口号(18999), 这个连接会加入到该IP节点下.
         d.反键点击这个连接,选择Open.

    此时就可以看到监控的界面, 从界面上我们可以看到CPU信息, 内存信息, 统计加载类数量,线程信息.
     
     

    jstatd [options] 


    此命令是一个RMI Server应用程序,提供了对JVM的创建和结束监视,也为远程监视工具提供了一个可以attach的接口

    options 
    -nr 当一个存在的RMI Registry没有找到时,不尝试创建一个内部的RMI Registry
    -p port 端口号,默认为1099
    -n rminame 默认为JStatRemoteHost;如果多个jstatd服务开始在同一台主机上,rminame唯一确定一个jstatd服务
    -J jvm选项

    jstatd
    会报如下错误:

      Could not create remote object access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write) java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) at java.security.AccessController.checkPermission(AccessController.java:546) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.System.setProperty(System.java:727) at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)

     
    这是因为没有给jstatd指定安全策略

    创建安全策略文件,并命名为jstatd.all.policy
    grant codebase "file:${java.home}/../lib/tools.jar" {
    permission java.security.AllPermission;
    };

    再次启动
    C:Program FilesJavajdk1.6.0_16in>jstatd -J-Djava.security.policy=jstatd.all.policy


     利用jps查看正在运行的java命令
     jps

    C:Documents and Settingslulu>jps
    4892 Bootstrap
    1296 Jstatd
    4484 Jps
    3332 org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar

    此时就可以使用jvisualvm.exe以远程的方式监控JVM相关信息了。

    更多例子

    (1)使用内部RMI Registry
    jstatd -J-Djava.security.policy=all.policy (默认端口为1099) 
    (2)使用外部RMI Registry
    a)使用默认值
    rmiregistry&
    jstatd -J-Djava.security.policy=all.policy
    b)使用2020端口
    rmiregistry 2020&
    jstatd -J-Djava.security.policy=all.policy -p 2020 
    c)使用2020端口,使用rminame
    rmiregistry 2020&
    jstatd -J-Djava.security.policy=all.policy -p 2020 -n AlternateJstatdServerName
    (3)RMI Registry已经启动,不创建内部RMI Registry
    jstatd -J-Djava.security.policy=all.policy -nr
    (4)RMI日志能力
    jstatd -J-Djava.security.policy=all.policy -J-Djava.rmi.server.logCalls=true

    http://hzl7652.iteye.com/blog/1183182

     
     
     
     
     
     
     
  • 相关阅读:
    LeetCode 88. Merge Sorted Array
    LeetCode 75. Sort Colors
    LeetCode 581. Shortest Unsorted Continuous Subarray
    LeetCode 20. Valid Parentheses
    LeetCode 53. Maximum Subarray
    LeetCode 461. Hamming Distance
    LeetCode 448. Find All Numbers Disappeared in an Array
    LeetCode 976. Largest Perimeter Triangle
    LeetCode 1295. Find Numbers with Even Number of Digits
    如何自学并且系统学习计算机网络?(知乎问答)
  • 原文地址:https://www.cnblogs.com/softidea/p/3939818.html
Copyright © 2020-2023  润新知