茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1729600 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_2494232.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

爪哇咖啡屋 : [轉貼]使用 jvisualvm 監控 Java 程序

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]使用 jvisualvm 監控 Java 程序

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

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();
Thread.sleep(1000);
}
}
}
複製代碼

然後,我們看 jvisualvm界面,在右側可以看到我們運行的程序,雙擊就可以在右側看到我們的程序:

Main程序在VisualVM中的展示

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

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文件。

將裡面的這兩行註釋去掉, monitorRolecontrolRole就是用戶名, QEDR&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 進行性能分析及調優


原文出處:使用jvisualvm监控Java程序(本地和远程) - 掘金
前一個主題 | 下一個主題 | | | |

討論串




Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|