利用VisualVm和JMX遠程監控Java進程

原文地址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

第一步:已經用jstatd鏈接了遠程主機

已經根據利用VisualVm遠程監控Java進程裏的方法在VisualVm裏添加了遠程主機。segmentfault

PS. 在實際使用過程當中這個彷佛不是必須的,可是若是不作,有些信息就會獲取不到,所以仍是作一下吧。bash

第二步:與啓動相關的System Properties

要給遠程主機上的監控的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鏈接

在遠程主機上右鍵,選擇添加JMX鏈接(在下圖裏出現了以前啓動的Tomcat進程):

圖片描述

根據Java進程啓動時設置的JMX System Properties配置JMX鏈接:

圖片描述

成功後你會發現多了一個進程,小圖標上有JMX字樣:

圖片描述

雙擊這個進程,你就能看到CPU、線程、還有MBeans了。

可是Visual GC沒有內容

使用上面的步驟創建完JMX鏈接以後,你會發現Visual GC沒有內容:

圖片描述

解決辦法要啓動jstatd。

按照利用VisualVm遠程監控Java進程的方法先創建遠程主機。

給這個遠程主機添加JMX鏈接:

圖片描述

圖片描述

而後你會發現多了一個JMX圖標的Java進程:

圖片描述

在這個進程裏就能看到Visual GC了。

圖片描述

參考資料

相關文章
相關標籤/搜索