当前位置: 首页 > news >正文

AOSP CachedAppOptimizer中的冻结和内存压缩功能

AOSP CachedAppOptimizer:应用进程长期处于 Cached 状态的内存压缩和冻结优化管控

冻结和内存压缩两个功能独立触发,可以单独触发也可以组合触发,默认顺序:先压缩,后冻结

public class OomAdjuster {    protected boolean applyOomAdjLSP(ProcessRecord app, boolean doingAll, long now,{        ...        if (state.getCurAdj() != state.getSetAdj()) {            //内存压缩            mCachedAppOptimizer.onOomAdjustChanged(state.getSetAdj(), state.getCurAdj(), app);        }        ...        updateAppFreezeStateLSP(app, oomAdjReson, false);        ...    }    void updateAppFreezeStateLSP(ProcessRecord app, @OomAdjReason int oomAdjReason,	...        if (state.getCurAdj() >= FREEZER_CUTOFF_ADJ && !opt.isFreezeExempt()   && !opt.shouldNotFreeze()) {              // 异步冻结	    freezeAppAsyncLSP(app); // 调用 mCachedAppOptimizer.freezeProcess	}        ...}public final class CachedAppOptimizer {    @GuardedBy({"mService", "mProcLock"})    void onOomAdjustChanged(int oldAdj, int newAdj, ProcessRecord app) {        if (useCompaction()) {            // Cancel any currently executing compactions            // if the process moved out of cached state            if (newAdj < oldAdj && newAdj < ProcessList.CACHED_APP_MIN_ADJ) {                cancelCompactionForProcess(app, CancelCompactReason.OOM_IMPROVEMENT);            }        }    }    void onProcessFrozen(ProcessRecord frozenProc) {        if (useCompaction()) {            synchronized (mProcLock) {                compactApp(frozenProc, CompactProfile.FULL, CompactSource.APP, false);            }        }        frozenProc.onProcessFrozen();    }}

行为模式

触发条件

资源压力/策略

只冻结,不压缩

-state.getCurAdj() >= FREEZER_CUTOFF_ADJ

-!opt.isFrozen()

-!opt.shouldNotFreeze()

- 内存充足但需省电

- 进程优先级未触发压缩阈值

newAdj ≥ CACHED_APP_MIN_ADJ

同时冻结+压缩

-oom_adj ≥ CACHED_APP_MIN_ADJ

- 进程未被取消压缩(!mPendingCompactionProcesses.contains(app)

- 内存碎片化严重(compact_full_rss_throttle_kb)

- 低电量模式

只压缩,不冻结

-oom_adj ≥ CACHED_APP_MIN_ADJ

-opt.isFreezeExempt()或

state.getCurAdj() < FREEZER_CUTOFF_ADJ

- CPU负载低

- 进程标记为不可冻结(如persistent)

不冻结也不压缩

-oom_adj < CACHED_APP_MIN_ADJ

- 或opt.shouldNotFreeze()

- 或压缩被取消(CancelCompactReason)

冻结(Freezer)策略与压缩交互

冻结(Freezer)和压缩(Compaction)的执行顺序是明确且不可随意调换的。默认顺序:先压缩,后冻结,冻结依赖压缩完成

冻结会将进程的内存页标记为不可移动(PG_dontdump),若先冻结再压缩,内核会跳过冻结进程的内存页,导致压缩失效。

场景

冻结状态

压缩状态

说明

进程刚进入缓存

❌ 未冻结

✅ 可压缩

优先触发FULL压缩,再根据资源压力决定是否冻结。

进程长期缓存

✅ 已冻结

❌ 不压缩

冻结后内存页标记为不可移动(PG_dontdump),避免压缩开销。

进程解冻后

❌ 解冻

✅ 可压缩

若仍满足缓存条件,可能触发新一轮压缩(需冷却时间)。

相关文章:

  • Java毕业设计:WML信息查询与后端信息发布系统开发
  • 【西门子杯工业嵌入式-4-什么是外部中断】
  • 软件测试用例篇——概念
  • JavaSec-SpringBoot框架
  • Python 接口:从协议到抽象基 类(定义并使用一个抽象基类)
  • go语言map扩容
  • 数据结构测试模拟题(4)
  • PySide6 GUI 学习笔记——常用类及控件使用方法(多行文本控件QTextEdit)
  • 1.认识Spring
  • 第3章:图数据模型与设计
  • 运行示例程序和一些基本操作
  • [ACTF2020 新生赛]Include 1(php://filter伪协议)
  • AI数据分析在体育中的应用:技术与实践
  • 从零设计一个智能英语翻译API:架构与实现详解
  • 计算机组成与体系结构:补码数制一(Complementary Number Systems)
  • 信息最大化(Information Maximization)
  • 大模型在创伤性脑出血全周期预测与诊疗方案中的应用研究
  • leetcode刷题日记——二叉搜索树中第 K 小的元素
  • 从认识AI开始-----AutoEncoder:生成模型的起点
  • Web前端基础
  • 做网站还是自媒体更适合赚钱/网站页面分析作业
  • 新乡网站推广/大型门户网站建设
  • 国际货代做网站/行业关键词搜索量排名
  • 怎样做diy家具网站/百度分析
  • 上海建设工程咨询协会/广东seo推广
  • 电子商务网站建设的必要性/厦门seo排名