天天看点

不用重新配置,用jconsole连接远程机器进程及获得本地进程的JMX Url的终极办法

估计有很多人都在想用jconsole连接远程机器上的进程时,发现没有配置jmx端口,或者其它的东东。

下面介始一种很简单的办法,可以不用重启远程机器的进程:

ssh -x  192.168.66.66  -l username

连接上去之后,可以直接运行jconsole进程,然后在本机就会弹出一个jconsole的窗口了。

实际上这个不是用jconsole连接远程机器的进程,而是把远程机器上的x输出转地本地来。

如果有提示失败,那么可能要配置下ssh可以转发x。

=====================================

但是如果是想用编程的方式去连接本地的java进程,而又不能更改配置重启。

比如你有个程序是用jmx的方式去得到监控数据的,那么肯定不能重启目标进程,如druid的statviewservlet:

https://github.com/alibaba/druid/wiki/%e9%85%8d%e7%bd%ae_statviewservlet%e9%85%8d%e7%bd%ae

可以用下面的方法来得到本地进程的jmx url。

在以前的博客《查找本地进程的jmx url的代码》里有提到activemq里获得本地进程的jmx url的方法。

http://blog.csdn.net/hengyunabc/article/details/8938281

这个方法有时却不起效,得到的是null,但是用jconsole却又能连接。于是研究了下jconsole的源代码,终于发现,原来jconsole在得不到目标进程的"com.sun.management.jmxremote.localconnectoraddress"环境变量值时,会先尝试让目标进程加载management-agent.jar,这样就可以得到jmx url了。

jconsole的相关源代码openjdk源代码下面的 jdk/src/share/classes/sun/tools/jconsole/localvirtualmachine.java 里。可以在这里直接看到:

http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/src/share/classes/sun/tools/jconsole/localvirtualmachine.java

下面是改进后的得到本地进程jmx url的代码,对于异常的处理不是很完善,不过不影响使用: