奶昔论坛
标题:
开发常用的一些 Android APP 内存 GC 性能优化方案
[打印本页]
作者:
Yangsh888
时间:
7 小时前
标题:
开发常用的一些 Android APP 内存 GC 性能优化方案
Android APP 内存 GC 性能优化核心围绕三个核心思路展开:
1、尽量不存在 GC 问题
2、用户操作时不随意 GC 耽误响应
3、APP 空闲时充分 GC 且不浪费算力。
尽量不 GC 的核心是减少内存回收的必要性。熟悉 C++ 的开发者都知道,析构函数会在对象退出作用域时自动释放内存,仅手动申请的内存需要用户自行管理。
iOS 的 GC 机制和华为方舟编译器都采用了引用计数方案,早期 Objective-C 就依赖这一思路,后来 Swift 为了兼容性也沿用类似设计。
但 Java 生态并不适合直接引入引用计数,改动范围过大,它更倾向于标记清除等 GC 方案。引用计数本身无法解决循环依赖问题,这是其核心局限。
为应对循环依赖,iOS 补充了弱引用机制,方舟编译器推测也采用了 “引用计数 + 循环依赖单独处理” 的方式,大概率同样依赖弱引用。
“不要乱 GC” 的核心是保障用户操作时的流畅性,把 CPU 算力优先给到用户交互。这就需要针对性缓解卡顿,比如在输入、滚动等高性能消耗场景中抑制 GC,只要系统内存充足,即便 APP 内存超过阈值也可暂时不触发。
常规 GC 的触发多与内存压力相关,此时必须通过回收内存才能满足使用需求,由此也衍生出动态内存上限的优化方案。而定时回收则介于各类条件之间,难以单独归类。
空闲时 GC 的优化可分为事前、事中、事后三个场景,分别对应启动前回收、帧间隙回收、退后台回收等方式。
事中的帧间隙回收,灵感来源于手机系统的 D-Vsync 渲染显示管线优化。APP 多数情况下能在一个 vsync 周期内完成一帧绘制,剩余的富余时间(从上一帧 RenderThread 完成 swapbuffer 到下一帧 vsync 信号到来的区间)可用于执行 GC。
现在 Android 的 GC 效率已大幅提升,单次回收通常仅需几毫秒,不会阻塞关键任务。但要注意,输入事件可能随时插入主线程响应,普通应用可等待下一帧处理输入,而游戏等实时性要求高的场景需限制 GC—— 不过这类场景大多不依赖 ART 的 GC 机制,影响不大。
此外,帧间隙 GC 并非每个 vsync 空闲周期都触发,还需结合内存使用量阈值判断,尤其超低端机帧间时间更紧张,需谨慎使用该方案。
题外话,近年来 AI 在性能优化领域的应用逐渐被提及。我们在 2022 年左右提出通过 AI 预测进行 CPU 调度,运用 GPA 极限稳帧技术,根据 CPU、GPU、FPS、温度、功耗等参数进行 AI 计算后顺滑调频,每分钟可决策 1200 次,平均 50 毫秒一次决策。
但对当前按帧周期调度的需求来说,这个决策频率仍显缓慢,不过 AI 在特定场景识别上仍有价值,比如判断用户对 APP 的使用习惯。
人工编写的算法在这方面效果往往有限,而 AI 若能识别出低频使用的 APP(即使用一次后短期不会再启动),便可直接清理其私有内存缓存,提升系统整体内存利用率。
欢迎光临 奶昔论坛 (https://forum.naixi.net/)
Powered by Discuz! X3.5