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(); 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的時候添加如下的參數,沒有換行:
true複製代碼
hostname
就是主機的地址, port
就是端口號,請確認這個端口號不要被佔用。 ssl
就是要不要加密,我這裡鏈接的開發環境就不加密了, authenticate
就是要不要用戶認證,賬號密碼就是 上一步 中配置的。
然後重新運行程序。
2.3 設置防火牆 敲黑板,注意這裡
運行完程序之後關閉服務器的防火牆,有很多教程都是讓把上一步中設置的端口號打開,但是其實,JXM還需要監聽兩個隨機的接口。要不直接關了防火牆,要不就把使用到的端口都打開。
2.4 配置jvisualvm 在左側 遠程
右擊 添加遠程主機
:
填寫信息之後,可以看到左側 遠程
下多了一個遠程主機,然後右擊,選擇 添加JXM鏈接
:
然後鏈接OK。
3 VisualVM的使用方法 然後我通過VisualVM監控遠程那個程序,看到堆內存只用了300多MB。
VisualVM的使用方法在網上有相當多的文章,這裡推薦一篇我覺得還不錯的,我就不再寫了:
使用 VisualVM 進行性能分析及調優