使用jvisualvm来远程观察Java程序

有时候,咱们可能须要远程查看某台机器上的Java程序的运行状况,例如,可能出现了内存泄露,可是只能在某个特定的环境中出现。这时候咱们就须要远程观察Java程序的一些执行状况。jvisualvm提供了很方便的界面来帮助咱们监控Java程序。
 
这里要介绍的第一种方式是,使用JMX来进行监控。

这种方式要求咱们在启动Java程序的时候手动开启jmx remote功能。开启的方式是使用下面的命令行参数启动Java程序: java

-Dcom.sun.management.jmxremote.port=<port> 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false

这里<port>是jxm remote使用的端口。你们能够随意改为本身想要的端口。 服务器

假设咱们要在10.2.3.4这台机器上启动一个Java程序foo.jar。那么咱们可使用下面的方式来启动程序。
工具

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

在这里咱们把端口设置成了40124。 spa

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

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

接下来,咱们就能够查看这个Java程序的信息,而且能够执行诸如Thread Dump或者Heap Dump的操做。
code

有一点缺陷是,目前的jvisualvm没法直接把远程的Java程序的heap dump到本地的机器上。当咱们点击jvisualvm的heap dump时,只能把heap dump到远程机器上的某台目录,而后还须要咱们本身去把heap dump文件拷贝到本地,再用jvisualvm打开来分析。
 
固然有时候,咱们在启动程序时,没有开发jmx remote功能,那么这是否是就没法监控了呢?No。Java自己提供了jstat工具来帮助用户查某个Java程序的执行信息。同时,Java还提供了jstatd,来让用户能够远程访问jstat产生的信息。
 
要使用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等信息的。
 
jvisualvm还有不少的功能,善用工具可让咱们事半功倍。
相关文章
相关标签/搜索