JAVA dump 堪稱 JVM 運行時的“高清 CT 影像”:其中 heap dump 以二進制 hprof 格式完整記錄堆內每一個存活對象、類加載器及錯綜複雜的引用鏈,藉助 retained size 計算可精準量化內存泄漏源頭;thread dump 則瞬間捕獲全部 JAVA 線程的調用棧、鎖競爭、等待隊列與 CPU 使用快照,一眼即可識別死鎖、線程池耗盡或慢調用瓶頸。
觀測雲在此基礎上進一步“把望遠鏡送進機房”:通過中心式 Agent 向任意 IP/端口上的目標 JVM 下發加密指令,一鍵觸發 jmap 內置命令,本地生成標準 hprof 格式 dump 後,立即調用內嵌 OSS SDK 以流式分片上傳,文件不落本地磁盤、不暴露 AccessKey,上傳完畢自動回傳元數據與 SHA256 摘要到觀測雲控制枱,完成“一鍵拍照、雲端閲片”的閉環,讓曾經高門檻的 JVM 級診斷變成隨取隨用的 SaaS 能力。
通過觀測雲平台,能把傳統“登錄機器→手動 jmap→scp 下載→本地 MAT/VisualVM 分析”這一動輒數小時的繁瑣流程,壓縮到 30 秒內完成,真正實現“現場凍結、秒級取證”。
實踐
當前最佳實踐是基於 Kubernetes 環境,通過觀測雲平台一鍵生成 JAVA dump 信息並上報至 AWS S3 。
前置條件
- 已註冊觀測雲帳號
- Kubernetes 環境已集成 DataKit
- 擁有可寫入 AWS S3 桶權限的 AK/SK
- DataKit 版本≥1.83.0
創建 S3 桶
S3 桶用於存儲 dump 文件。
DataKit 開啓 dump 文件存儲
調整 datakit.yaml,新增以下內容,填寫 aws 相關配置。調整完成後,重新執行 apply 操作。
- name: ENV_REMOTE_JOB_ENABLE
value: 'true'
- name: ENV_REMOTE_JOB_ENVS
value: >-
REMOTE=aws,AWS_DEFAULT_REGION=cn-northwest-1,AWS_ACCESS_KEY_ID=xxxxxxx,AWS_SECRET_ACCESS_KEY=xxxxxx,AWS_BUCKET_NAME=java-dump
- name: ENV_REMOTE_JOB_INTERVAL
value: 100s
其他雲廠商存儲參考文檔 https://docs.guance.com/datakit/datakit-conf/#remote-job
創建任務
登錄觀測雲平台,應用性能監測 - 服務 - 服務清單,選擇對應的 java 服務,點擊創建內存快照按鈕進行創建。
內存快照需要找到對應的目標方可創建。
點擊歷史快照按鈕,可以查看創建的歷史記錄及快照狀態、日誌信息。
快照執行日誌詳情。
驗證 S3 是否存儲成功
登錄 S3 控制枱查看是否有對應的文件生成。
驗證快照文件是否可用
從 S3 下載快照後,在本地嘗試解析。
可以使用 jhat 命令解析 dump文件,並用瀏覽器直接查看,格式 jhat <dump-file-name> 。
瀏覽器訪問 7000 端口。
F&Q
服務清單找不到對應的服務
服務清單數據是基於鏈路信息按照每小時一次進行構建的,頁面上會展示上次更新的時間,所以需要先有鏈路訪問才會有對應的服務。
有服務,但找不到執行目標
如果一個服務長期沒有鏈路,比如一天都沒有鏈路,則不會有執行目標,需要進行業務訪問對應服務產生鏈路後才會看到執行目標。