遊戲 Lag 白皮書 › L10 記憶體
記憶體配置暴增 Allocation storms
原因 ID mem-alloc · 主要負責 遊戲開發團隊(伺服器開發)
在含圖解與實驗的完整版中開啟卡片 →
活動期間大量產生暫時物件時,GC 執行的頻率會比平常高出許多。
為什麼 道具掉落、戰鬥 log、活動獎勵讓暫時物件暴增 → 於是 GC 頻率增加數倍,還沒來得及變成垃圾的物件被移到 Old 區,Full GC 也跟著提早發生 → 畫面上 只在活動期間週期性地頓一下
- 症狀
- 卡頓, 定格
- 因素
- 停滯
- 誰會遇到
- 整個伺服器, 特定地點/頻道
- 何時
- 人潮湧入時
- 負責單位
- 主要負責 遊戲開發團隊(伺服器開發)
- 遊戲開發團隊要做的事
- 物件池、可重複使用的緩衝區、記憶體配置剖析(profiling)。
- 圖表上
- 隨人數/負載上升 · GC 次數、配置速度
- 查看位置
- 用 GC log(Java -Xlog:gc、Go GODEBUG=gctrace=1)計算每分鐘 GC 次數;.NET 看 dotnet-counters 的配置量與 GC 次數(.NET 9 以後為 dotnet.gc.heap.total_allocated、dotnet.gc.collections,8 以下為 Allocation Rate、Gen 0 GC Count)。與同時上線人數、活動時間疊在一起看
- 符合的跡象
- 活動開始後,配置速度與 GC 次數增加得比人數還快,短暫的暫停變得頻繁。活動結束後恢復原狀
- 不符合的跡象
- GC 次數不變、單次暫停變長時,是存活資料增加(mem-gc-thrash、mem-leak)
- 確認方式
- 用基礎設施工具確認(不需要遊戲程式碼)
出處
- Garbage Collector Implementation Oracle
Young 區滿了就進行 minor GC,部分存活物件會移到 Old 區;Old 區滿了就回收整個 heap(比 minor GC 久得多);-Xlog:gc 每次 GC 記錄一行 - A Guide to the Go Garbage Collector Go
配置速度越高,GC 週期越頻繁;以 GODEBUG=gctrace=1 輸出 GC 追蹤資訊 - dotnet-counters diagnostic tool .NET
.NET 9 以後顯示為 dotnet.gc.heap.total_allocated、dotnet.gc.collections,.NET 8 以下顯示為 Allocation Rate、Gen 0 GC Count
相關原因
同一層:L10 記憶體
同一症狀(卡頓)在其他層的原因
查看含圖解與實驗的完整版卡片