当前位置: 首页 > 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.xdnf.cn/news/929503.html

相关文章:

  • 11.无重复字符的最长子串
  • LUFFY(路飞): 使用DeepSeek指导Qwen强化学习
  • 34 C 语言字符串转数值函数详解:strtol、strtoll、strtoul、strtoull(含 errno 处理、ERANGE 错误)
  • 创建一个纯直线组成的字体库
  • 【强连通分量 缩点 最长路 拓扑排序】P2656 采蘑菇|普及+
  • Linux 文本三剑客(grep, awk, sed)
  • 运维_集运维核心学习
  • xctf-weak_auth(弱口令)
  • 【C++ 真题】P1747 好奇怪的游戏
  • 23、字节对齐
  • 22、模板特例化
  • WPF 播放器(AudioPlayer 2025)
  • triton学习笔记6: Fused Attention
  • CAN转PROFINET网关设备基本功能介绍
  • Android资源ID冲突解决方案
  • 28、元组的遍历
  • Redis :String类型
  • 第23讲、Odoo18 邮件系统整体架构
  • AIGC行业发展演进:从技术萌芽到智能革命
  • 全面解析:tzst 归档格式的先进性与跨平台文件管理指南
  • RTOS学习之重难点
  • go语言学习 第8章:切片
  • CMake检测C编译器标志功能
  • 基于51单片机的24小时倒计时仿真
  • CAN转PROFINET协议网关之PROFINET转CANfree组态秘诀
  • 10.接雨水
  • 九、【ESP32开发全栈指南: UDP通信服务端】
  • Redis 持久化机制深度解析
  • 反向传播的核心是什么:计算损失函数对可训练参数的梯度=== 损失函数能通过计算图连接到可训练参数
  • 打印高质量日志的10条军规