本文由曹素傑(阿裡雲 MVP 石化盈科資訊技術有限責任公司 進階工程師)提供,若使用請标明出處。
記憶體溢出的表現:
a) CPU會飙升到100%,如果是多核則乘以核數
b) 日志中會出現OutOfMemoryError
分析原因步驟:
a) 使用jmap建立heap檔案,指令如下:
/opt/edas/jdk/java/bin/jmap -F -dump:format=b,file=/home/admin/csc.dmp pid
b) 建立成功後壓縮下dump檔案,指令如下:
c) 下載下傳dump檔案到本地,指令如下:
d) 本地使用jprofiler打開快照檔案,界面如下:

從圖中可以看到字元串和hashmap占用的比較多,相對來講,hashmap比string要好分析一些,這裡使用hashmap,選中hashmap節點,右鍵use selected instanced出現界面
點選确定
随機選擇一個hashmap的節點,展開檢視引用對象,如下:
可以看到正在進行HSF的hessian序列話,說明正在接收一個HSF服務結果,并且該結果超大,可以展開map檢視結果資料,如圖:
從這裡可以看到調用的是客戶中心的資料,這時可以上EDAS控制台,檢視鷹眼的調用情況,時間選擇奔潰的時間點,傳回結果選擇大于10K,如圖:
能看到有一個延遲較大的調用
點選進入詳情
可以看到傳回的結果超大,再結合應用端的日志則可以排查對應的接口為什麼傳回大量的資料?
另外也可以和RDS慢日志配合,大部分情況資料都來自于RDS,可以進入到RDS性能優化控制台,檢視傳回行數較大的sql,如圖:
這樣也可以分析到是哪個接口導緻的。
建議在EDAS台添加如下配置,記憶體溢出的時候可以自動建立dump檔案,以下為docker配置示例,ecs配置換個路徑: