天天看點

java mission control_JVM系列九(虛拟機性能監控工具 - Java Mission Control).

一、寫在前面

上一篇文章 我們介紹了性能監控的一些指令,包括 jmap (生成堆存儲快照)和 jstack(生成線程快照),事實上,在沒有一些監控工具之前,我們用的最多的也是這兩個指令來進行虛拟機性能的監控調優。但是這兩個指令都有自己不足的地方:

使用 jmap 指令,從 Heap Dump 開始,整個 JVM 都是停頓的,幾G 的 Heap 可能産生幾秒的停頓,在生産環境上執行時需要謹慎再謹慎。

使用 jstack 指令,ThreadDump 同樣會造成 JVM 停頓,加了 -l 參數,停頓時間更長,在生産環境上執行要謹慎再謹慎。

後來一些監控工具就應運而生,比如 Jconsule、VisualVM 以及收費的 JProfiler 等,這篇文章主要介紹 Java Mission Control。

二、Java Mission Control

Java Mission Control(簡稱 JMC) 是一個用于對 Java 應用程式進行管理、監視、概要分析和故障排除的工具套件,在 JDk7 7u40之後免費自帶,運作 “JAVA_HOME”\bin\jmc.exe 即可運作 JMC。

JMC 的另一個優點就是:采用取樣,而不是傳統的代碼植入技術,對應用性能的影響非常非常小,完全可以開着 JMC 來做壓測(唯一影響可能是 full gc 多了)。

JMC 主要包括兩種功能:

實時監控 JVM 運作時的狀态

Java Flight Recorder 取樣分析

2.1 實時監控

如果是遠端伺服器,使用前要開 JMX

-Dcom.sun.management.jmxremote.port=${YOUR PORT}

-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.authenticate=false

-Dcom.sun.management.jmxremote.ssl=false

-Djava.rmi.server.hostname=${YOUR HOST/IP}

檔案 -> 連接配接 -> 建立新連接配接, 填入上面 JMX 參數的 host 和 port

java mission control_JVM系列九(虛拟機性能監控工具 - Java Mission Control).

通過“+”按需添加各種統計圖表。

“觸發器” tab 可以根據 CPU、線程等資訊,設定一定的門檻值,來觸發報警。

“記憶體” tab 提供 heap 和 GC 的資訊。可以關注 GC次數、時間以及随着 GC 發生 heap 的記憶體變化情況,以此來調整 jvm 參數。

“線程” tab 可以關注每條線程所占的CPU、死鎖情況以及線程堆棧資訊。

2.2 Flight Recorder(取樣分析)

要采用取樣,必須先添加參數:

-XX:+UnlockCommercialFeatures

-XX:+FlightRecorder

取樣時間預設 1 分鐘,可自行按需調整,事件設定選為 profiling,然後可以設定取樣 profile 哪些資訊,比如:

加上對象數量的統計:Java Virtual Machine -> GC -> Detailed -> Object Count/Object Count after GC

方法調用采樣的間隔從 10ms 改為 1ms(但不能低于 1ms,否則會影響性能了): Java Virtual Machine -> Profiling -> Method Profiling Sample/Method Sampling Information

Socket 與 File 采樣, 10ms 太久,但即使改為 1ms 也未必能抓住什麼,可以幹脆取消掉: Java Application->File Read/FileWrite/Socket Read/Socket Write

java mission control_JVM系列九(虛拟機性能監控工具 - Java Mission Control).

然後就開始 Profile,到時間後 Profile 結束,會自動把記錄下載下傳回來,在 JMC 中展示。

java mission control_JVM系列九(虛拟機性能監控工具 - Java Mission Control).

從展示資訊中,我們大緻可以讀到 JVM參數、GC、熱點代碼、對象配置設定以及線程等詳細資訊。

一般來說,盡可能確定以下幾點,你的程式會跑得更快:

配置設定更少的對象

盡可能少進行 full gc

盡可能少在 TLAB 外配置設定對象