博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用jvisualvm来远程观察Java程序
阅读量:6483 次
发布时间:2019-06-23

本文共 1714 字,大约阅读时间需要 5 分钟。

hot3.png

本文为转载学习

原文链接:

这里要介绍的第一种方式是,使用JMX来进行监控

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

-Dcom.sun.management.jmxremote.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。

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

190458_wU9w_1417419.png

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

190616_N2lE_1417419.png

接下来,我们就可以查看这个Java程序的信息,并且可以执行诸如Thread Dump或者Heap Dump的操作

190737_1n6m_1417419.png

190738_RFBf_1417419.png

有一点缺陷是,目前的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。

191536_0Tfo_1417419.png

接下来我们就可以看到这台机器上所有的Java程序了(仅限启动jstatd的用户有权限查看的程序)。

当然jstatd有一定的局限性,它只能查看信息,不能执行诸如Thread Dump和Heap Dump等操作。但是jstatd对于我们分析Java内存的状态一般来说是足够了。

如果可以的话,最好同时开启JMX和jstatd。这样可以看到更丰富的信息。比如,只有JMX是看不到Main Class和Arguments等信息的。

jvisualvm还有很多的功能,善用工具可以让我们事半功倍。

转载于:https://my.oschina.net/heroShane/blog/196227

你可能感兴趣的文章
Linux 平台七大桌面环境通览
查看>>
dubbo请求调用过程分析
查看>>
《Oracle SQL疑难解析》——1.9 从表中删除不需要的行
查看>>
《易学C++(第2版)》——2.8 习题
查看>>
[Google Guava] 1.3-常见Object方法
查看>>
《Android开发进阶:从小工到专家》——第1章,第1.5节小结
查看>>
找bug记(2)
查看>>
数学好,语文就差?
查看>>
《精通软件性能测试与LoadRunner最佳实战》—第1章1.6节软件测试流程
查看>>
秘密武器:使用 SysRq 键安全重启挂起的 Linux
查看>>
Linux有问必答:Perl中本地时间和UNIX时间戳间相互转换
查看>>
《DB2性能管理与实战》——2.2 数据库管理器共享内存
查看>>
《Nmap渗透测试指南》—第6章6.3节指定偏移大小
查看>>
深入实践Spring Boot2.5 小结
查看>>
百度NLP | 智能写作机器人:不抢人类饭碗,我们只想人机协作
查看>>
深入实践Spring Boot2.2 使用Redis
查看>>
Java设计模式:观察者
查看>>
如何设计一个牛掰的大型项目架构?
查看>>
如何在云服务提供商的平台上使用Docker Machine
查看>>
微服务治理实战:服务流的自动化构建与应用
查看>>