当前位置: 首页 > 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),避免压缩开销。

进程解冻后

❌ 解冻

✅ 可压缩

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

http://www.lqws.cn/news/205795.html

相关文章:

  • vector使用及模拟
  • nodejs中的I/O操作指的是什么?
  • 好未来0520上机考试题2:有效三角形的个数
  • 好未来0520上机考试题1:括号的最大嵌入深度
  • 微服务架构的性能优化:链路追踪与可观测性建设
  • # STM32F103 SD卡读写程序
  • [NOI2016] 网格
  • C++ 中的编译期计算(Compile-Time Computation)
  • 22、模板特例化
  • 双面沉金线路板制作流程解析:高可靠性PCB的核心工艺
  • bat批量去掉本文件夹中的文件扩展名
  • 数据类型 -- 字符
  • Python基于Django的文件销毁系统【附源码、文档说明】
  • 操作系统进程管理解析:从 fork 到 exec 的全流程实战与底层原理
  • Unity | AmplifyShaderEditor插件基础(第五集:简易膨胀shader)
  • ThingsCloud事物云平台搭建-微信小程序
  • 【基础算法】差分算法详解
  • 【Linux】SSH:免密登录
  • Design Theory and Method of Complex Products: A Review
  • 数据通信基础
  • 【51单片机】2. 进阶点灯大师
  • AI浪潮下的IT行业:威胁、转变与共生之道
  • 小白成长之路-Linux Shell脚本练习
  • PC与Windows远程连接与串流:方案简介(ZeroTier + Parsec、Moonlight + Sunshine、网易UU远程)
  • Vue3 项目的基本架构解读
  • CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)
  • C# 类和继承(扩展方法)
  • React Hooks 示例项目
  • 基于 STM32 的四路 PWM 控制智能小车运动的模块化控制程序
  • natapp 内网穿透失败