Java應用上雲後被kill問題分析與解決
因為 GC 時間過長導致 k8s 檢活失敗,被 kill 掉
因為記憶體碎片的問題,導致 OOM 被 kill 掉
具體現象和分析
解決
透過 GC 日誌,分析主要耗時點。推薦 GC 分析工具:,調整 JVM引數。 k8s 調整了檢活機制,由原來超時 10s、20s,最後調整為 2min。 透過分析日誌發現主要的長時 GC 是因為新生代晉升失敗,擴大 young 區和堆大小最佳化 JVM 引數。
現象
JVM堆記憶體分析
pmap 記憶體對映分析
pmap說明Address: 記憶體開始地址Kbytes: 佔用記憶體的位元組數(KB)RSS: 保留記憶體的位元組數(KB)Dirty: 髒頁的位元組數(包括共享和私有的)(KB)Mode: 記憶體的許可權:read、write、execute、shared、private (寫時複製)Mapping: 佔用記憶體的檔案、或[anon](分配的記憶體)、或[stack](堆疊)Offset: 檔案偏移Device: 裝置名 (major:minor)
引入記憶體分配器
ptmalloc 解讀
1. 透過 fastbins 查詢合適記憶體塊,
2. 1沒有,從 small bin 中獲取,
3. 2沒有,從 unsorted bin 中獲取,
4. 3沒有,從 large bin 中獲取,
5. 4沒有,從 top chunk 中,
1. 判斷是否是 mmap 對映,是直接回收
2. 判斷是否鄰近 top chunk
3. 不是2,根據 size 放到不同的 bins 中
4. 是2,判斷 top chunk 中鄰近記憶體是否在使用 是 合併 top chunk
替換記憶體分配器解決記憶體碎片問題
執行緒記憶體池:在一個程式中每個執行緒會有自己的記憶體池,用來管理自己的記憶體使用,會大幅度減少併發時鎖的效能損失。
鎖粒度:使用非公平鎖,替換自旋鎖,減少 CPU 空轉。


最佳化 dump 體驗。原來容器 dump 時會存在 dump 到一半機器就重啟的問題,跟基礎架構 和技術運營的同學溝通後,對該部分做了最佳化,讓業務分析 GC 時間過長有了實質性幫助。
確認監控問題。之前大家看到容器使用監控上應用重啟都是因為記憶體翻倍使用,但實際情況是容器在重啟後,監控平臺把兩個容器使用的記憶體求和了,沒有單獨分開處理。
支援可選擇分配器。基礎架構部門對 jemalloc 和 tcmalloc 的記憶體分配器進行支援。
華庭 :《Glibc記憶體管理-Ptmalloc2 原始碼分析》
JeMalloc-UncP 知乎
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024923/viewspace-2933589/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java執行緒池詳解
- 商用資料庫上雲的方式與存在的問題(下)
- vh 存在問題?試試動態視口單位之 dvh、svh、lvh
- 音訊編輯服務UI SDK接入指導及常見問題
- 聊聊自動駕駛必須解決哪些感知問題?交通標誌識別技術詳解
- 記一次線上FGC問題排查
- 《JavaScript二十年》閱讀整理
- 大資料實時多維OLAP分析資料庫Apache Druid入門分享-上
- 虛擬翻書在展館中使用的優點分析
- 從 ClickHouse 到 ByteHouse:實時資料分析場景下的最佳化實踐
- JavaScript 中更安全的 URL 讀寫
- 聊聊國產資料庫遷移中的表連線效能問題
- Java執行緒池中的execute和submit
- 力扣之x的平方根(雙指標解法思路分析最佳化)
- ApiView/Request類原始碼分析/序列化器
- 大資料實時多維OLAP分析資料庫Apache Druid入門分享-下
- Dubbo 中 Zookeeper 註冊中心原理分析
- 車牌識別服務-JAVA+ONNX版本,支援全型別的車牌
- Windows啟動問題修復(重建活動分割槽)