JVM監控可以直觀展示指定時間段內的多項記憶體指標,雖然圖表能體現出記憶體使用量量過大的情況,但無法顯示具體資訊,因此不能協助您排查問題產生的原因。此時您可以建立記憶體快照,通過詳細的日誌查看記憶體佔用的詳細資料,協助您排查記憶體流失和記憶體浪費等記憶體問題。
前提條件
已下載ARMS Java Probe探針,且探針版本為2021年09月24日之後發布的2.7.1.2或以上版本。
目前僅支援為Linux系統建立記憶體快照。
使用限制
建立記憶體快照需要確保操作帳號具備AliyunARMSFullAccess許可權。
記憶體快照功能是JVM內建的HeapDump能力(等價於jmap -dump:all)的平台化,HeapDump本身可能出現佔用一定量額外記憶體、觸發SafePoint和GC等情況,這些情況會暫停所有非JVM Thread,從而造成應用暫停,暫停時間無法控制,因此請您在生產環境使用前做好相關風險評估後,再使用此功能。
使用記憶體快照功能,對應用有以下依賴限制:
2.7.3.5及以下版本的探針:不支援JRE環境、不支援Java 11、依賴JAVA_HOME環境變數、依賴JAVA_HOME/lib/tools.jar檔案、不支援Alpine平台。
2.8.3至3.2.8版本的探針:支援JRE、支援Java 8和Java 11、支援Alpine平台、依賴JAVA_HOME環境變數、依賴Java命令(需要將
$JAVA_HOME/bin配置到PATH環境變數)。3.2.9及以上版本探針:記憶體快照進行了大量最佳化,已無需將$JAVA_HOME/bin配置到PATH環境變數。建議優先將探針升級到3.2.9或以上版本,升級操作請參見升級ARMS探針。
如果應用所部署環境的VPC網路設定了可訪問阿里雲Object Storage Service的Bucket限制策略,需要將記憶體快照功能相關的Bucket(arms-heapdump-<regionId>)配置在您的策略規則中。請將<regionId>換成對應的地區ID,例如您應用部署在cn-hangzhou地區,Bucket則對應為arms-heapdump-cn-hangzhou。
說明由於該功能會將應用執行個體所採集的快照資料上傳到ARMS統一的OSS Bucket中進行儲存與處理,如果配置相關策略但未將ARMS統一的OSS Bucket配置在其中會導致資料無法被有效採集。
當前歷史快照儲存時間長度暫無限制,但ARMS將於2023年07月01日零時調整歷史快照的儲存時間長度為90天,即07月01日零時起,ARMS將不再儲存90天前的快照任務,請及時做好資料備份。
建立記憶體快照
登入ARMS控制台,在左側導覽列選擇。
在應用列表頁面頂部選擇目標地區,然後單擊目標應用程式名稱。
說明語言列的表徵圖含義如下:
:接入應用監控的Java應用。
:接入應用監控的Golang應用。
:接入應用監控的Python應用。-:接入Managed Service for OpenTelemetry的應用。
在左側導覽列單擊應用詳情,在頁面右側單擊JVM監控頁簽。
在JVM監控頁簽右上方,單擊建立記憶體快照。
在建立記憶體快照對話方塊中選擇一個IP,並單擊儲存。
說明如果在應用詳情頁面左側已選擇目標執行個體,則IP欄位會預設選中該執行個體的IP地址。
在彈出的提示框中單擊強制dump。
重要快照任務的已耗用時間從幾分鐘到半小時不等。應用進程在轉儲期間會停止回應,請謹慎使用。
查看記憶體快照詳情
在JVM監控頁簽右上方,單擊歷史快照。
在快照任務數量面板展示了任務執行狀態:綠色表示快照任務執行成功,藍色表示快照任務執行中,紅色表示快照任務執行失敗。單擊任務右側的詳情可以查看任務執行進度。
單擊目標任務右側的分析,在應用診斷分析平台查看分析結果。
常見問題
為什麼不能在應用出現OOM前自動建立快照並做分析?
一般應用在即將出現OOM前,系統資源使用率都很高,由於快照建立一般會佔用一定資源,此時如果自動建立快照,有很大風險可能直接導致應用出現OOM,ARMS暫不支援這種使用情境。建議採用以下步驟進行快照擷取與分析:
為應用配置以下參數後,應用出現OutOfMemoryError時JVM將會自動產生記憶體快照,產生的快照檔案路徑被設定為
/tmp/heap.bin。注意,在Kubernetes環境下需要將
/tmp/heap.bin路徑掛載至外部儲存卷,避免Pod重啟導致檔案丟失。-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heap.bin將上一步在OOM時自動建立的記憶體快照上傳到阿里雲Object Storage Service中,具體操作,請參見開始使用OSS。
使用阿里雲應用診斷分析平台分析記憶體快照。