使用jvisualvm來遠程觀察Java程序

有時候,咱們可能須要遠程查看某臺機器上的Java程序的運行狀況,例如,可能出現了內存泄露,可是隻能在某個特定的環境中出現。這時候咱們就須要遠程觀察Java程序的一些執行狀況。jvisualvm提供了很方便的界面來幫助咱們監控Java程序。
 
這裏要介紹的第一種方式是,使用JMX來進行監控。

這種方式要求咱們在啓動Java程序的時候手動開啓jmx remote功能。開啓的方式是使用下面的命令行參數啓動Java程序: 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。 spa

接下來咱們打開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的操做。
code

有一點缺陷是,目前的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還有不少的功能,善用工具可讓咱們事半功倍。
相關文章
相關標籤/搜索