使用jvisualvm來遠端觀察Java程式

五柳-先生發表於2016-06-15

這裡要介紹的第一種方式是,使用JMX來進行監控

這種方式要求我們在啟動Java程式的時候手動開啟jmx remote功能。開啟的方式是使用下面的命令列引數啟動Java程式:

-Dcom.sun.management.jmxremote.port=<port> -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

這裡<port>是jxm remote使用的埠。大家可以隨意改成自己想要的埠。

假設我們要在10.2.3.4這臺機器上啟動一個Java程式foo.jar。那麼我們可以使用下面的方式來啟動程式。

java -Dcom.sun.management.jmxremote.port=40124 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar foo.jar

在這裡我們把埠設定成了40124。

接下來我們開啟jvisualvm,然後在Remote上點選右鍵,填上我們要監控的伺服器host: 10.2.3.4,點選OK。

接下來,我們在10.2.3.4上面右鍵選擇Add JMX Connection,把Connection資訊填成10.2.3.4:40124。這裡埠號就是我們之前啟動foo.jar時設定的埠號。

接下來,我們就可以檢視這個Java程式的資訊,並且可以執行諸如Thread Dump或者Heap Dump的操作

有一點缺陷是,目前的jvisualvm無法直接把遠端的Java程式的heap dump到本地的機器上。當我們點選jvisualvm的heap dump時,只能把heap dump到遠端機器上的某臺目錄,然後還需要我們自己去把heap dump檔案拷貝到本地,再用jvisualvm開啟來分析。

當然有時候,我們在啟動程式時,沒有開發jmx remote功能,那麼這是不是就無法監控了呢?No。Java本身提供了jstat工具來幫助使用者查某個Java程式的執行資訊。同時,Java還提供了jstatd,來讓使用者可以遠端訪問jstat產生的資訊。

要使用jstatd的時候我們需要先建一個檔案jstatd.all.policy,內容如下:

grant codebase "file:${java.home}/../lib/tools.jar" {
   permission java.security.AllPermission;
};

接下里我們使用下面的命令來啟動jstatd(注意,啟動jstatd的使用者要求跟啟動Java程式的使用者一致,不然jstatd就沒有許可權訪問程式的資訊了):

jstatd -p 40123 -J -Djava.security.policy=jstatd.all.policy

這裡的40123是jstatd監聽的埠,也就是我們要連線時使用的埠,jstatd.all.policy就是我們剛才建立的檔案所在的路徑

啟動之後,我們在10.2.3.4上右鍵,選擇Add jstatd Connection,填上埠號40123,然後點選OK。

接下來我們就可以看到這臺機器上所有的Java程式了(僅限啟動jstatd的使用者有許可權檢視的程式)。

當然jstatd有一定的侷限性,它只能檢視資訊,不能執行諸如Thread Dump和Heap Dump等操作。但是jstatd對於我們分析Java記憶體的狀態一般來說是足夠了。

如果可以的話,最好同時開啟JMX和jstatd。這樣可以看到更豐富的資訊。比如,只有JMX是看不到Main Class和Arguments等資訊的。

jvisualvm還有很多的功能,善用工具可以讓我們事半功倍。

原文連結:http://blog.iamzsx.me/show.html?id=394002

相關文章