한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

遊戲 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)
確認方式
用基礎設施工具確認(不需要遊戲程式碼)

出處

  1. Garbage Collector Implementation Oracle
    Young 區滿了就進行 minor GC,部分存活物件會移到 Old 區;Old 區滿了就回收整個 heap(比 minor GC 久得多);-Xlog:gc 每次 GC 記錄一行
  2. A Guide to the Go Garbage Collector Go
    配置速度越高,GC 週期越頻繁;以 GODEBUG=gctrace=1 輸出 GC 追蹤資訊
  3. dotnet-counters diagnostic tool .NET
    .NET 9 以後顯示為 dotnet.gc.heap.total_allocated、dotnet.gc.collections,.NET 8 以下顯示為 Allocation Rate、Gen 0 GC Count

相關原因

同一層:L10 記憶體

同一症狀(卡頓)在其他層的原因

查看含圖解與實驗的完整版卡片