天天看點

不用重新配置,用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的代碼,對于異常的處理不是很完善,不過不影響使用: