如何使用VisualVM和JMX?

11

我尝试了书中的每个食谱,但今天事情就是不顺利...

我正在尝试使用VisualVM对运行在远程服务器上的Java应用程序进行分析,所以我搜索了很多方法,最终找到了这个解决方案:

java -Dcom.sun.management.jmxremote \
  -Dcom.sun.management.jmxremote.port=9199 \
  -Dcom.sun.management.jmxremote.local.only=false \
  -Dcom.sun.management.jmxremote.authenticate=false \
  -Dcom.sun.management.jmxremote.ssl=false \
  -jar bin/felix.jar

运行这个命令会让我得到 JMX 功能,然后我可以在 9199 端口上看到它正在运行:

java      21947        root    9u  IPv6 1811434      0t0  TCP *:7192 (LISTEN)
java      26376        root   14u  IPv6 1844518      0t0  TCP *:9199 (LISTEN)
此外,我可以测试端口在Web上是否可见: enter image description here 现在,当我尝试在我的机器上使用VisualVM打开连接(该机器也可以ping jmx服务器)时,会出现以下情况: enter image description here enter image description here enter image description here 我一定是太蠢了,以至于这个世界上每个人都能让这个东西运行,但我不行。该死...
编辑:我安装了wireshark来了解底层情况,所以我看到了这个。只要我在VisualVM中添加一个远程IP地址,wireshark就开始检测到这种重复活动: enter image description here 但是,如果我尝试添加一个新的JMX连接并要求它连接,wireshark将无法抓取该连接尝试的任何一个数据包。 enter image description here 对我来说,这似乎是VisualVM甚至没有尝试连接,尽管给出了错误消息“无法连接”...!!到底是怎么回事?

1
也许这可以解决问题 - 确保您的主机IP已正确配置 https://dev59.com/OHRA5IYBdhLWcg3wxA5N - pklndnst
我之前尝试过那个 :( 尽管端口对网络可见,但似乎什么都不起作用。 - PedroD
出于好奇,您的桌面和启用JMX的进程之间是否有防火墙?我知道您说端口9199是开放的;但是,JMX需要第二个端口,该端口是随机分配的且不可配置的。这在尝试通过防火墙使用JMX时会导致巨大问题。也许不是您的问题,只是提供一个要查看的内容:https://blogs.oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx - Michael
我不知道是否存在任何防火墙。负责网络的系统管理员表示之间没有防火墙。JMX必须是DCOM技术的近亲。他们如何将这些简单的事情变成过度工程化和不起作用的解决方案...该死... - PedroD
3个回答

11

使用以下选项启动您的服务:

-Djava.rmi.server.hostname=193.163.XXX.XXX
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=9199 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false

那么您可以使用jvisualvm或jconsole,只需使用"193.163.XXX.XXX:9199"地址。


4
请按照以下步骤操作:
1)打开远程机器的X11转发
2)在Windows安装XMING
3)在远程机器上启动Visual VM,GUI将出现在Windows Xming中
4)使用localhost而不是IP,并使用相同的端口号。
如果以上步骤不起作用,则表示配置有误。
如果以上步骤正常工作,请进入iptables并确保对外使用端口9199开放。同时,使用java -Djava.rmi.server.hostname=YOUR_IP启动程序。
更多详细信息请参考此链接

0
请使用以下JVM选项:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=<PORT> -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=<IP>

在VisualVM中使用以下内容进行连接:
service:jmx:rmi:///jndi/rmi:/<IP>:<PORT>/jmxrmi

希望这能有所帮助。


感谢您的建议。它没有起作用,仍然会显示完全相同的错误消息。http://i.imgur.com/Cm46gpM.png http://i.imgur.com/yrTAFIv.png端口9199仍然可以在全球范围内访问。 - PedroD
你使用了我提供的Java选项吗?它与你的略有不同:-Djava.rmi.server.hostname=<IP>。 - Arnab Biswas
在VisualVM中:service:jmx:rmi:///jndi/rmi:/193.136.102.224:9199/jmxrmi - PedroD
我无法编辑以前的评论来隐藏IP。该命令的响应可以在此处查看:http://pastebin.com/z8DmHhyX有没有办法在这些评论中放置代码? - PedroD
1
很抱歉我不能帮助你。你可以尝试使用hawtio:http://hawt.io/getstarted/。简而言之,它通过HTTP公开了JMX。我用它来监视tomcat。根据文档,你需要像这样做:java -jar hawtio-app-1.4.50.jar --port 8090 - Arnab Biswas
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接