JVisualVM远程监控

本文主要转自:http://blog.iamzsx.me/show.html?id=394002

                    http://www.wl566.com/wz/64022.html

1. 通过JMX方式监控远程linux上运行java程序

    远程服务器:

    要求在执行java程序时,加入若干参数:

      java -Dcom.sun.management.jmxremote.port=40124 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false     -Djava.rmi.server.hostname=10.2.3.4  MultiThreads

说明:

     注意:这些命令需要在同一行!


     -Dcom.sun.management.jmxremote.port=40124:// 选取未被占用的端口


     -Dcom.sun.management.jmxremote.authenticate=false  //不使用密码验证


     -Djava.rmi.server.hostname=10.2.3.4  // 填运行程序的主机的ip。可以通过hostname -i 查看本地IP。如果是127.0.0.1,则需要修改,否则远程连接时本地无法区分。

      可以通过在/etc/hosts中添加(外网ip 计算机名)记录,我当时添加了(10.2.3.4 xzhangcentosxzhangcentos)这条记录,

      否则会报“java.net.MalformedURLException:Local host name unknown: java.net.UnknownHostException: xzhangcentos:xzhangcentos: 未知的名称或服务”错误。

      MultiThreads:class文件的文件名。也可以加-jar xxxx.jar。

      例如:java -Dcom.sun.management.jmxremote.port=40124 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar foo.jar

      接下来我们打开jvisualvm,然后在Remote上点击右键,填上我们要监控的服务器host: 10.2.3.4,点击OK。
 
     

 

      接下来,我们在10.2.3.4上面右键选择Add JMX Connection,把Connection信息填成10.2.3.4:40124。这里端口号就是我们之前启动foo.jar时设置的端口号。
 
    


    在这种方式下,java程序中断,监控连接随之中断。

    jvisualvm无法直接把远程的Java程序的heap dump到本地的机器上。当我们点击jvisualvm的heap dump时,只能把heap dump到远程机器上的某台目录,

    然后还需要我们自己去把heap dump文件拷贝到本地,再用jvisualvm执行“文件”-“装入”,打开来分析。

 

2. 通过JMX方式监控远程Tomcat

    如果Tomcat是部署在Linux/Unix主机上:

    首先在Tomcat/bin目录下执行./shutdown.sh,关闭Tomcat服务。然后在catalina.sh中设置JAVA_OPTS处加上(原来JAVA_OPTS设置可能是注释掉的,不用管它,直接在这行后加):

    JAVA_OPTS="$JAVA_OPTS  -Dcom.sun.management.jmxremote  -Dcom.sun.management.jmxremote.port=9999  -Dcom.sun.management.jmxremote.authenticate=false    - Dcom.sun.management.jmxremote.ssl=false"

    其中9999为设置的JMX端口号。

    保存,关闭。再执行./startup.sh启动Tomcat服务。

    然后,就可以通过上节中的方法添加对远程Tomcat的监控了。

    需要注意的是,如果要再关闭Tomcat服务,需要将加入的这一行注释掉。否则关闭不成功。

 

3. 通过jstatd方式监控远程linux上运行的java程序

   使用jstatd的时候我们需要先建一个文件jstatd.all.policy,内容如下:

 grant codebase "file:${java.home}/../lib/tools.jar" {
      permission java.security.AllPermission;
 };
 
   接下里我们使用下面的命令来启动jstatd(注意,启动jstatd的用户要求跟启动Java程序的用户一致,不然jstatd就没有权限访问程序的信息了):
 
jstatd -p 40123 -J -Djava.security.policy=jstatd.all.policy
 
   这里的40123是jstatd监听的端口,也就是我们要连接时使用的端口,jstatd.all.policy就是我们刚才创建的文件所在的路径。
 
   启动之后,我们在10.2.3.4上右键,选择Add jstatd Connection,填上端口号40123,然后点击OK。
  
   接下来我们就可以看到这台机器上所有的Java程序了(仅限启动jstatd的用户有权限查看的程序)。
 
   当然jstatd有一定的局限性,它只能查看信息,不能执行诸如Thread Dump和Heap Dump等操作。但是jstatd对于我们分析Java内存的状态一般来说是足够了。
 
   如果可以的话,最好同时开启JMX和jstatd。这样可以看到更丰富的信息。比如,只有JMX是看不到Main Class和Arguments等信息的。
 

本文主要转自:http://blog.iamzsx.me/show.html?id=394002

                    http://www.wl566.com/wz/64022.html
posted @ 2014-11-22 16:05  Jtianlin  阅读(2717)  评论(0编辑  收藏  举报