原文地址html
在前一篇文章裏咱們發現經過jstatd + VisualVm的方式,不能得到Java進程的CPU、線程、MBean信息,這時JMX就要登場了。java
自Java 6開始,Java程序啓動時都會在JVM內部啓動一個JMX agent,JMX agent會啓動一個MBean server組件,把MBeans(Java平臺標準的MBean + 你本身建立的MBean)註冊到它裏面,而後暴露給JMX client管理。簡單來講就是每一個Java程序均可以經過JMX來被JMX client管理,並且這一切都是自動發生的。而VisualVm就是一個JMX Client。git
VisualVm可以自動發現本機的Java進程,若是要監控遠程主機上的Java進程則須要顯式地配置JMX鏈接,下面講配置方法:github
已經根據利用VisualVm遠程監控Java進程裏的方法在VisualVm裏添加了遠程主機。segmentfault
PS. 在實際使用過程當中這個彷佛不是必須的,可是若是不作,有些信息就會獲取不到,所以仍是作一下吧。bash
要給遠程主機上的監控的Java進程在啓動時必須帶上幾個JMX相關的System Properties(經常使用的幾個):oracle
com.sun.management.jmxremote.port
, 指定暴露的JMX端口。com.sun.management.jmxremote.rmi.port
, 指定RMI connector端口,能夠和com.sun.management.jmxremote.port
保持一致。com.sun.management.jmxremote.ssl
, 指定是否使用SSL,在開發環境下能夠是false,可是在生產環境下強烈建議爲true。com.sun.management.jmxremote.authenticate
, 指定是否須要密碼纔可以建立JMX鏈接。爲了演示目的,咱們用Tomcat來測試,不開啓ssl和authenticate,把JMX端口設置爲1100
,執行下列命令啓動Tomcat:ide
CATALINA_OPTS='-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1100 -Dcom.sun.management.jmxremote.rmi.port=1100 -Djava.rmi.server.hostname=k8s-oracle' bin/startup.sh
注意上面有一個-Djava.rmi.server.hostname=k8s-oracle
參數,JMX agent本質上也是一個RMI server,所以須要指定這個參數,不然就會像利用VisualVm遠程監控Java進程裏提到的同樣,VisualVm沒法鏈接到該Java進程。post
PS. 使用SSL方式保護JMX鏈接的方法會另寫文章說明。測試
在遠程主機上右鍵,選擇添加JMX鏈接(在下圖裏出現了以前啓動的Tomcat進程):
根據Java進程啓動時設置的JMX System Properties配置JMX鏈接:
成功後你會發現多了一個進程,小圖標上有JMX字樣:
雙擊這個進程,你就能看到CPU、線程、還有MBeans了。
使用上面的步驟創建完JMX鏈接以後,你會發現Visual GC沒有內容:
解決辦法要啓動jstatd。
按照利用VisualVm遠程監控Java進程的方法先創建遠程主機。
給這個遠程主機添加JMX鏈接:
而後你會發現多了一個JMX圖標的Java進程:
在這個進程裏就能看到Visual GC了。