低内存(am_low_memory) 和 进程被杀(am_proc_died)触发内存回收机制(low memory killer)

77 阅读4分钟

am_mem_factor

am_mem_factor 是 Android 系统内存管理模块(ActivityManagerService) 输出的 内存状态等级(memory factor) 日志。

比如:am_mem_factor: [1,3]

字段含义
am_mem_factor表示系统当前内存压力等级的状态。
[1,3]两个整数值,分别表示:
[prev, current],即 之前的内存等级 → 当前的内存等级

内存等级定义

等级值含义
0MEMORY_FACTOR_NORMAL – 内存充足
1MEMORY_FACTOR_MODERATE – 内存轻度紧张
2MEMORY_FACTOR_LOW – 内存中度紧张
3MEMORY_FACTOR_CRITICAL – 内存极度紧张

表示系统内存状态从 轻度紧张(1) 恶化到了 极度紧张(3) ,触发了更激进的内存回收策略(如杀后台、限制服务等)

  • 如果你看到 [1,3][2,3] 频繁出现,说明系统内存压力正在快速上升。
  • 建议结合 am_low_memoryam_proc_diedkillinfo 等日志一起分析,确认是否有大量进程被杀。

killinfo: [9790,10025,500,201,...]

killinfo 是 内核层 lowmemorykiller(LMK) 杀进程时留下的 killinfo 日志,非常详细,可以看作是 “死亡报告”

killinfo: [9790,10025,500,201,68552,3,19112,710892,31896,928,10468,96192,1668700,182736,280604,280240,277920,328092,542628,70192,203048,45424,62080,0,0,0,6024,444,12,37,0,24224,418712,12,12,23.139999,5.810000,8.730000,1.450000,61.099998]

字段解释

索引含义
09790被杀进程的 PID
110025被杀进程的 UID
2500oom_score_adj(越高越容易被杀)
3201杀进程的原因码(通常是 LMK_PROCNOSPACE 或类似)
468552进程总内存(KB)
53杀进程的策略(通常是 CACHEDSERVICE
619112进程匿名内存(KB)
7710892进程总 RSS(KB)
831896进程共享内存(KB)
9928进程私有干净内存(KB)
1010468进程私有脏内存(KB)
1196192进程共享干净内存(KB)
121668700系统总内存(KB)
13~18182736...328092各类型内存使用(缓存、匿名、共享等)
19~2270192...62080GPU、DMA、ION 等内存
23~240,0保留字段
256024杀进程时系统可用内存(KB)
26444杀进程时系统缓存内存(KB)
2712杀进程时系统匿名内存(KB)
2837杀进程时系统共享内存(KB)
290保留
3024224杀进程时系统 ION 内存(KB)
31418712杀进程时系统 GPU 内存(KB)
3212杀进程时系统 DMA 内存(KB)
3312杀进程时系统 DMA32 内存(KB)
34~3723.13...61.09各类内存使用百分比(匿名、缓存、共享、GPU)

系统在 17:54:51LMK 杀掉了 com.sprd.providers.photos(PID 9790) ,因为它内存占用 68MB,oom_score_adj 为 500(可杀) ,而当时系统可用内存仅剩 6MB,处于 极度紧张状态

建议:

  • 这条日志说明系统内存已非常紧张(可用仅 6MB),连 系统服务(如照片提供器) 都被杀了。
  • 建议优化系统内存配置,或排查是否有内存泄漏/常驻进程过多。

AMS 杀进程时的真实排序(Android 13 为例

ADJ值越小越难杀
-900SYSTEM (system_server)
-800PERSISTENT (persistent 应用)
-700PERSISTENT_UI
-600TOP_APP (当前 Resume 的 Activity)
200PERCEPTIBLE (前台服务、通知)
400CACHED (空进程)

android.intent.category.HOME 只是把应用标记为 “桌面候选” ,让系统在按 Home 键时把它列入选择列表;
它并不会给进程带来任何杀不死的特权