使用jvisualvm監控Java程式(本地和遠端)

柴澤建_Jack發表於2017-12-21

0 起因

不感興趣的可以直接從 1 本地Java程式監控 開始看

0.1 發現問題

使用top命令檢視Java程式使用的記憶體,大於設定的最大的使用記憶體。(top介面檢視的是RES欄位的值,設定Java程式執行最大堆記憶體方式是-Xmx方法)

這是我top的結果,大概是650MB。

top檢視程式執行狀態

這是我執行Java程式的指令碼,可以看到-Xmx500m,已經指定了500MB的最大使用堆記憶體。

執行Java程式的執行指令碼

0.2 問題解決

  1. 查詢top命令結果中RES欄位的具體含義是程式使用的記憶體,未被換出的也算
  2. 查詢-Xmx的含義,就是Java程式使用的最大堆記憶體。
  3. 通過以上可以說明,這兩個含義並不對應。Java中除了堆記憶體,還有棧記憶體。所以比我們設定的500MB多也正常。

由此考慮,如何才能監控Java程式使用記憶體狀況呢?經過一番查詢知道了Java自帶的jvisualvm,但是找到的教程,按照操作又踩了很多坑。這裡自己總結一下完整過程。

1 本地Java程式監控

1.1 本地啟動jvisualvm

JDK根目錄的bin資料夾下可以找到jvisualvm,直接在終端敲命令jvisualvm就可以執行,然後可以看到執行介面。

jVisualVM介面

然後我隨便執行一個不會馬上關閉的Java程式,例如:

public class Main {

    public static void main(String[] args) throws InterruptedException {
        for (int i = 10000; i > 0; i--) {
            System.out.println("Hello World!");
            Thread.sleep(1000);
        }
    }
}
複製程式碼

然後,我們看jvisualvm介面,在右側可以看到我們執行的程式,雙擊就可以在右側看到我們的程式:

Main程式在VisualVM中的展示

具體監控的內容暫時不做介紹,我們繼續講啟動方式。

1.2 IntelliJ IDEA的VusalVM

我使用的是IntelliJ Idea進行後臺開發的。在IntelliJ Idea中有一個外掛VusualVM Luncher

使用jvisualvm監控Java程式(本地和遠端)

安裝完成之後重啟IDEA,然後在以前執行的地方可以看到:

使用jvisualvm監控Java程式(本地和遠端)

如果你之前實驗的jvisualvm視窗還開著,那你可以先把它關閉。然後使用Run With VisualVM執行程式,第一次會出現配置介面:

使用jvisualvm監控Java程式(本地和遠端)

選擇JDK根目錄下,bin資料夾下的jvisualvm就可以了,完成配置,執行程式就可以看到啟動了VisualVM,在Windows下可以直接開啟執行的應用,但在Mac上不行,要自己雙擊才行。

2 遠端Java程式監控

伺服器開發有很多,打的包也不同。我們是直接打成Jar包,然後使用jar命令直接執行jar包。本文只提供jar包方式執行的方法。其他的例如war,使用Tomcat啊什麼的可以根據自己開發的具體環境,去網上查詢。但是注意2.3步提到的,我在這一步踩了很久的坑。

2.1 遠端伺服器配置JXM

在遠端伺服器上的JDK根目錄下的/jre/lib/management資料夾下,將jmxremote.password.template檔案複製一份jmxremote.password,然後開啟jmxremote.password檔案。

將裡面的這兩行註釋去掉,monitorRolecontrolRole就是使用者名稱,QEDR&D分別是密碼,最後更改了密碼,當然和可以使用同樣的格式自己新增使用者,對於使用者的許可權是在jmxremote.access檔案中配置的,這兩個角色的許可權預設已經配置了,如果自己新增的使用者,你需要自己在這個檔案中新增相應的配置,我們暫時就使用controlRole這個角色,因為他的許可權比較多:

#monitorRole QED
#controlRole R&D
複製程式碼

2.2 修改啟動jar的引數

在執行jar的時候新增如下的引數,沒有換行:

-Djava.rmi.server.hostname=10.40.2.90 -Dcom.sun.management.jmxremote.port=18999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true
複製程式碼

hostname就是主機的地址,port就是埠號,請確認這個埠號不要被佔用。ssl就是要不要加密,我這裡連結的開發環境就不加密了,authenticate就是要不要使用者認證,賬號密碼就是上一步中配置的。

然後重新執行程式。

2.3 設定防火牆

敲黑板,注意這裡

執行完程式之後關閉伺服器的防火牆,有很多教程都是讓把上一步中設定的埠號開啟,但是其實,JXM還需要監聽兩個隨機的介面。要不直接關了防火牆,要不就把使用到的埠都開啟。

2.4 配置jvisualvm

在左側遠端右擊新增遠端主機

使用jvisualvm監控Java程式(本地和遠端)

填寫資訊之後,可以看到左側遠端下多了一個遠端主機,然後右擊,選擇新增JXM連結

使用jvisualvm監控Java程式(本地和遠端)

然後連結OK。

3 VisualVM的使用方法

然後我通過VisualVM監控遠端那個程式,看到堆記憶體只用了300多MB。

VisualVM的使用方法在網上有相當多的文章,這裡推薦一篇我覺得還不錯的,我就不再寫了:

使用 VisualVM 進行效能分析及調優

相關文章