使用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。

接下來,我們在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;
};
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還有很多的功能,善用工具可以讓我們事半功倍。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!