使用jvisualvm來遠程觀察Java程序

jopen 11年前發布 | 53K 次閱讀 jvisualvm Java開發

原文鏈接:http://blog.iamzsx.me/show.html?id=394002

有時候,我們可能需要遠程查看某臺機器上的Java程序的運行情況,例如,可能出現了內存泄露,但是只能在某個特定的環境中出現。這時候我們就需要遠程觀察Java程序的一些執行情況。jvisualvm提供了很方便的界面來幫助我們監控Java程序。
 

這里要介紹的第一種方式是,使用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。
d1.png
 
接下來,我們在10.2.3.4上面右鍵選擇Add JMX Connection,把Connection信息填成10.2.3.4:40124。這里端口號就是我們之前啟動foo.jar時設置的端口號。
 
d2.png
 
接下來,我們就可以查看這個Java程序的信息,并且可以執行諸如Thread Dump或者Heap Dump的操作。
 
d3.png
 
d4.png
 
有一點缺陷是,目前的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。
d5.png
接下來我們就可以看到這臺機器上所有的Java程序了(僅限啟動jstatd的用戶有權限查看的程序)。
 
當然jstatd有一定的局限性,它只能查看信息,不能執行諸如Thread Dump和Heap Dump等操作。但是jstatd對于我們分析Java內存的狀態一般來說是足夠了。
 
如果可以的話,最好同時開啟JMX和jstatd。這樣可以看到更豐富的信息。比如,只有JMX是看不到Main Class和Arguments等信息的。
 
jvisualvm還有很多的功能,善用工具可以讓我們事半功倍。
 
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!