不感興趣的能夠直接從 1 本地Java程序監控 開始看java
使用
top
命令查看Java程序使用的內存,大於設置的最大的使用內存。(top
界面查看的是RES
字段的值,設置Java程序運行最大堆內存方式是-Xmx
方法)bash
這是我top的結果,大概是650MB。服務器
這是我執行Java程序的腳本,能夠看到-Xmx500m,已經指定了500MB的最大使用堆內存。性能
top
命令結果中RES
字段的具體含義是進程使用的內存,未被換出的也算。-Xmx
的含義,就是Java程序使用的最大堆內存。由此考慮,如何才能監控Java程序使用內存情況呢?通過一番查找知道了Java自帶的jvisualvm,可是找到的教程,按照操做又踩了不少坑。這裏本身總結一下完整過程。加密
在JDK
根目錄的bin
文件夾下能夠找到jvisualvm
,直接在終端敲命令jvisualvm
就能夠運行,而後能夠看到運行界面。spa
而後我隨便運行一個不會立刻關閉的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
具體監控的內容暫時不作介紹,咱們繼續講啓動方式。cdn
我使用的是IntelliJ Idea
進行後臺開發的。在IntelliJ Idea
中有一個插件VusualVM Luncher
server
安裝完成以後重啓IDEA,而後在之前運行的地方能夠看到:
若是你以前實驗的jvisualvm窗口還開着,那你能夠先把它關閉。而後使用Run With VisualVM
運行程序,第一次會出現配置界面:
選擇JDK根目錄下,bin
文件夾下的jvisualvm
就能夠了,完成配置,運行程序就能夠看到啓動了VisualVM
,在Windows下能夠直接打開運行的應用,但在Mac上不行,要本身雙擊才行。
服務器開發有不少,打的包也不一樣。咱們是直接打成Jar包,而後使用jar命令直接運行jar包。本文只提供jar包方式運行的方法。其餘的例如war,使用Tomcat啊什麼的能夠根據本身開發的具體環境,去網上查找。可是注意2.3步提到的,我在這一步踩了好久的坑。
在遠程服務器上的JDK根目錄下的/jre/lib/management
文件夾下,將jmxremote.password.template
文件複製一份jmxremote.password
,而後打開jmxremote.password
文件。
將裏面的這兩行註釋去掉,monitorRole
和controlRole
就是用戶名,QED
和R&D
分別是密碼,最後更改了密碼,固然和可使用一樣的格式本身添加用戶,對於用戶的權限是在jmxremote.access
文件中配置的,這兩個角色的權限默認已經配置了,若是本身添加的用戶,你須要本身在這個文件中添加相應的配置,咱們暫時就使用controlRole
這個角色,由於他的權限比較多:
#monitorRole QED
#controlRole R&D
複製代碼
在運行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
就是要不要用戶認證,帳號密碼就是上一步中配置的。
而後從新運行程序。
敲黑板,注意這裏
運行完程序以後關閉服務器的防火牆,有不少教程都是讓把上一步中設置的端口號打開,可是其實,JXM還須要監聽兩個隨機的接口。要不直接關了防火牆,要不就把使用到的端口都打開。
在左側遠程
右擊添加遠程主機
:
填寫信息以後,能夠看到左側遠程
下多了一個遠程主機,而後右擊,選擇添加JXM連接
:
而後連接OK。
而後我經過VisualVM監控遠程那個程序,看到堆內存只用了300多MB。
VisualVM的使用方法在網上有至關多的文章,這裏推薦一篇我以爲還不錯的,我就再也不寫了: