使用jvisualvm來遠程觀察Java程序

本文爲轉載學習html

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

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

這種方式要求咱們在啓動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。spa

接下來咱們打開jvisualvm,而後在Remote上點擊右鍵,填上咱們要監控的服務器host: 10.2.3.4,點擊OK。命令行

接下來,咱們在10.2.3.4上面右鍵選擇Add JMX Connection,把Connection信息填成10.2.3.4:40124。這裏端口號就是咱們以前啓動foo.jar時設置的端口號。code

接下來,咱們就能夠查看這個Java程序的信息,而且能夠執行諸如Thread Dump或者Heap Dump的操做htm

有一點缺陷是,目前的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還有不少的功能,善用工具可讓咱們事半功倍。

相關文章
相關標籤/搜索