0 起因
不感興趣的可以直接從 1 本地Java程式監控 開始看
0.1 發現問題
使用
top
命令檢視Java程式使用的記憶體,大於設定的最大的使用記憶體。(top
介面檢視的是RES
欄位的值,設定Java程式執行最大堆記憶體方式是-Xmx
方法)
這是我top的結果,大概是650MB。
這是我執行Java程式的指令碼,可以看到-Xmx500m,已經指定了500MB的最大使用堆記憶體。
0.2 問題解決
- 查詢
top
命令結果中RES
欄位的具體含義是程式使用的記憶體,未被換出的也算。 - 查詢
-Xmx
的含義,就是Java程式使用的最大堆記憶體。 - 通過以上可以說明,這兩個含義並不對應。Java中除了堆記憶體,還有棧記憶體。所以比我們設定的500MB多也正常。
由此考慮,如何才能監控Java程式使用記憶體狀況呢?經過一番查詢知道了Java自帶的jvisualvm,但是找到的教程,按照操作又踩了很多坑。這裡自己總結一下完整過程。
1 本地Java程式監控
1.1 本地啟動jvisualvm
在JDK
根目錄的bin
資料夾下可以找到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
介面,在右側可以看到我們執行的程式,雙擊就可以在右側看到我們的程式:
具體監控的內容暫時不做介紹,我們繼續講啟動方式。
1.2 IntelliJ IDEA的VusalVM
我使用的是IntelliJ Idea
進行後臺開發的。在IntelliJ Idea
中有一個外掛VusualVM Luncher
安裝完成之後重啟IDEA,然後在以前執行的地方可以看到:
如果你之前實驗的jvisualvm視窗還開著,那你可以先把它關閉。然後使用Run With VisualVM
執行程式,第一次會出現配置介面:
選擇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
檔案。
將裡面的這兩行註釋去掉,monitorRole
和controlRole
就是使用者名稱,QED
和R&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
在左側遠端
右擊新增遠端主機
:
填寫資訊之後,可以看到左側遠端
下多了一個遠端主機,然後右擊,選擇新增JXM連結
:
然後連結OK。
3 VisualVM的使用方法
然後我通過VisualVM監控遠端那個程式,看到堆記憶體只用了300多MB。
VisualVM的使用方法在網上有相當多的文章,這裡推薦一篇我覺得還不錯的,我就不再寫了: