游戏卡顿白皮书 › L1 客户端游戏进程
客户端内存泄漏 Client memory leak
原因 ID cg-leak · 主责 研发团队·客户端开发
在含图示和实验的完整版中打开此卡片 →
运行越久内存占用越大,游戏越来越慢,最终被强制关闭。
起因 切换区域时纹理、UI、特效没有释放 → 结果 GC 变频繁,系统内存不足,发生 swap → 画面表现 玩几个小时后越来越一卡一卡,最后被强制关闭(玩家看来像掉线)
- 症状
- 一卡一卡, 掉线
- 因素
- 停顿
- 谁会遇到
- 只有我
- 何时出现
- 开得越久越严重
- 负责方
- 主责 研发团队·客户端开发
- 研发团队要做的事
- 切换区域时测量内存占用,找出并修复未释放的纹理、UI、特效,做长时间自动化测试(长稳测试,soak test)。
- 监控图上
- 缓慢爬升 · 游戏进程内存
- 查看位置
- 用性能监视器把 Process(游戏)\Private Bytes 记录几个小时。移动端看 Android ApplicationExitInfo 的退出原因(REASON_LOW_MEMORY)和 iOS jetsam 报告
- 确认依据
- 每次往返切换区域,内存都上涨且不回落;运行越久,一卡一卡和被强制关闭的情况越多
- 排除依据
- 内存稳定、只是运行越久越颤动,看“float 时间精度丢失”
- 确认手段
- 需在玩家侧环境确认
- 深入了解
- 手机主要靠压缩内存硬撑。内存还是不够时,系统会直接把游戏杀掉(闪退)。内存越小的设备越先被杀。
出处
- Memory allocation among processes Android (Google)
Android 把内存压缩进 zRAM 硬撑,不够时由低内存终止程序(low memory killer)结束进程;前台应用被结束时看起来像崩溃 - Identifying high-memory use with jetsam event reports Apple
iOS 在内存压力无法缓解时会强制结束应用(jetsam),超过单个应用的内存上限就会成为结束对象 - Find user-mode memory leaks with Performance Monitor (PerfMon) Microsoft
长时间记录 Process > Private Bytes(进程分配的专用内存)、Virtual Bytes,只涨不降就是泄漏 - ApplicationExitInfo Android (Google)
REASON_LOW_MEMORY:系统的低内存终止程序结束了应用进程(不支持的设备会报告为 REASON_SIGNALED、SIGKILL)
相关原因
同一层:L1 客户端游戏进程
其他层中同样导致“一卡一卡”的原因
查看含图示和实验的原卡片