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

游戏卡顿白皮书 › L1 客户端游戏进程

客户端内存泄漏 Client memory leak

原因 ID cg-leak · 主责 研发团队·客户端开发

在含图示和实验的完整版中打开此卡片 →

运行越久内存占用越大,游戏越来越慢,最终被强制关闭。

起因 切换区域时纹理、UI、特效没有释放 → 结果 GC 变频繁,系统内存不足,发生 swap → 画面表现 玩几个小时后越来越一卡一卡,最后被强制关闭(玩家看来像掉线)

症状
一卡一卡, 掉线
因素
停顿
谁会遇到
只有我
何时出现
开得越久越严重
负责方
主责 研发团队·客户端开发
研发团队要做的事
切换区域时测量内存占用,找出并修复未释放的纹理、UI、特效,做长时间自动化测试(长稳测试,soak test)。
监控图上
缓慢爬升 · 游戏进程内存
查看位置
用性能监视器把 Process(游戏)\Private Bytes 记录几个小时。移动端看 Android ApplicationExitInfo 的退出原因(REASON_LOW_MEMORY)和 iOS jetsam 报告
确认依据
每次往返切换区域,内存都上涨且不回落;运行越久,一卡一卡和被强制关闭的情况越多
排除依据
内存稳定、只是运行越久越颤动,看“float 时间精度丢失”
确认手段
需在玩家侧环境确认
深入了解
手机主要靠压缩内存硬撑。内存还是不够时,系统会直接把游戏杀掉(闪退)。内存越小的设备越先被杀。

出处

  1. Memory allocation among processes Android (Google)
    Android 把内存压缩进 zRAM 硬撑,不够时由低内存终止程序(low memory killer)结束进程;前台应用被结束时看起来像崩溃
  2. Identifying high-memory use with jetsam event reports Apple
    iOS 在内存压力无法缓解时会强制结束应用(jetsam),超过单个应用的内存上限就会成为结束对象
  3. Find user-mode memory leaks with Performance Monitor (PerfMon) Microsoft
    长时间记录 Process > Private Bytes(进程分配的专用内存)、Virtual Bytes,只涨不降就是泄漏
  4. ApplicationExitInfo Android (Google)
    REASON_LOW_MEMORY:系统的低内存终止程序结束了应用进程(不支持的设备会报告为 REASON_SIGNALED、SIGKILL)

相关原因

同一层:L1 客户端游戏进程

其他层中同样导致“一卡一卡”的原因

查看含图示和实验的原卡片