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

0 原由

不感興趣的能夠直接從 1 本地Java程序監控 開始看java

0.1 發現問題

使用top命令查看Java程序使用的內存,大於設置的最大的使用內存。(top界面查看的是RES字段的值,設置Java程序運行最大堆內存方式是-Xmx方法)bash

這是我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就能夠運行,而後能夠看到運行界面。spa

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界面,在右側能夠看到咱們運行的程序,雙擊就能夠在右側看到咱們的程序:code

Main程序在VisualVM中的展現

具體監控的內容暫時不作介紹,咱們繼續講啓動方式。cdn

1.2 IntelliJ IDEA的VusalVM

我使用的是IntelliJ Idea進行後臺開發的。在IntelliJ Idea中有一個插件VusualVM Luncherserver

安裝完成以後重啓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的時候添加以下的參數,沒有換行:

-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的使用方法在網上有至關多的文章,這裏推薦一篇我以爲還不錯的,我就再也不寫了:

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

相關文章
相關標籤/搜索