估计有很多人都在想用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的代码,对于异常的处理不是很完善,不过不影响使用: