EN

Android 系统不释放内存吗?

字数统计: 3.9k阅读时长: 13 min
2018/09/13
loading

除了 CPU,很多用户在选购手机的时候通常也会考虑内存大小,不同版本内存的手机价格也不一样,买多大内存的合适呢?Android 系统是怎么管理内存的呢?普通用户对 Android 手机的内存使用总是一头雾水,这个应用到底占了多少内存?系统到底占了多少内存?内存对我手机的使用体验有什么影响?到底怎么才能用好 Android 手机?换新手机换多大内存的会比较合适呢?

知乎上有一个问题,一个用户问 “Android 系统不释放内存吗?”,用户并不是不知道系统会释放内存,而是想知道其中的细节,好优化使用的体验,下面我就从用户的几个问题入手,来简单说明一下,比较深入的细节我后续的文章会详细介绍。

同时也会对第一段中提到的几个问题提出一些个人的见解,欢迎一起来讨论,留下你的问题,提出你的见解,大家共同进步。

版本说明(2026-10-13 核查):本文写于 2018 年,截图来自当时的设备和应用,未记录完整 ROM 版本。下文保留这些案例,修正内存统计、退出方式和启动类型的解释,并补充 Android 12–15 的变化。原文“经常一键全杀”和“6 GB 起步、8 GB 最佳”的建议已过期。

Android系统下关闭程序后,系统内存并不释放?

先分清“关闭”的对象:离开一个页面、移除一个任务、结束进程和强制停止应用,结果不同。页面不再显示,进程仍可能作为缓存保留,这不等于系统不会回收内存。

点击Back键退出.

先举个空应用的例子。当时测试的包名是 com.example.gaojianwu.myapplication,PID 为 5708。图中这个进程位于 Foreground 分组,内存统计值为 13910 kB:

原测试:PID 5708 位于 Foreground 分组

点击 Back 后,再看 adb shell dumpsys meminfo:

原测试:PID 5708 位于 Cached 分组

同一个 PID 仍存在,分组变成 Cached,数值降到 12337 kB。这说明当时进程被保留了,不能仅据此判断它还在持续执行代码。这里的分组反映进程重要性,并不是 CPU 调度优先级;数值对应这类输出中的 PSS 统计,不是 Java 堆大小。

Back 通常处理当前页面或任务的返回,默认不会直接“杀整个进程”。Android 12(API 31)还改变了任务根部启动 Activity 的默认行为:对于声明 ACTION_MAIN 和 CATEGORY_LAUNCHER 的根 Activity,Back 会把任务移到后台,而不是结束它。其他 Activity 的返回以及应用自定义处理,需要分别看。见任务和返回栈说明。

在任务管理器中杀掉应用

从最近任务界面划走卡片,与设置里的“强制停止”不是同一个操作。厂商任务管理器可能额外清理进程,应用也可能因仍有服务或其他组件而保留,不能把某个 ROM 的行为推广到所有 Android 设备。

当时用的是魅族 MX4 Pro。打开同一个测试应用,再用任务管理器清理,得到下面的局部输出:

原测试:任务管理器清理后的 Cached 列表片段

我当时据此判断测试进程被结束了。不过,这张裁图只显示该列表片段里已没有 PID 5708,不能独自证明应用所有进程都已退出,也不能证明它之后不会再被启动。

通过命令行或者开发者工具杀掉应用

开发排查时,可以对指定应用使用 adb shell am force-stop PACKAGE_NAME,其中 PACKAGE_NAME 要替换为实际包名。它会停止应用并设置包的 stopped 状态,语义比单纯结束一个 PID 更强。

Android 15(API 35)的强制停止说明明确要求由直接或间接的用户操作解除 stopped 状态,并会取消应用的 PendingIntent。不能把“普通进程被杀后可能重新拉起”套用成“强停后应用可以随意自启动”。

原文所用旧版开发工具的局部截图

这张旧图只截到了 Logcat/ADB 工具栏,没有按钮提示或操作结果,不能据此确认某个按钮等价于 force-stop。当前 Android Studio 的停止运行、终止进程和清空日志也应按具体动作区分。

即使关掉后台进程,内存也增加不多?

进程真正退出后,它的地址空间和进程私有资源会被回收,但系统界面上的“可用内存”不一定立刻按相同数值上涨。共享页可能还被其他进程引用,文件页可能留在缓存里,图形缓冲也可能仍由系统或其他消费者持有。某些资源需要等最后的引用释放后才能回收;同一时刻,其他进程也可能在分配内存。

再拿当时的知乎 App 看看。下面分别是打开前、打开后和清理后的截图,单位仍用图里的 kB:

打开知乎前:Free RAM 1837160 kB

打开知乎后:Free RAM 1805784 kB

知乎进程:PID 6389,PSS 49907 kB

任务管理器清理后:Free RAM 1862296 kB

原测试时点 Free RAM 括号中的 free
打开前 1837160 kB 202620 kB
打开后 1805784 kB 37864 kB
清理后 1862296 kB 83500 kB

这组图最容易误读的是 Free RAM:它包含括号中的 cached pss + cached + free,并不是只有最后一项纯空闲页。以 AOSP android-5.1.1_r1 的同类输出为参照,这一栏把缓存进程的 PSS、内核缓存和空闲内存相加;这不代表已确认原测试 ROM 就是该版本。

清理后,图中 Free RAM 比打开后增加了 56512 kB,但这个差值不等于知乎那一项 49907 kB。它只能说明两个快照的汇总值发生了变化,不能证明“应用占用多少,清理后就原样增加多少”。Cached 进程仍占 RAM;系统把它列为可回收对象,是为了在需要时腾出空间。

据说即使前台关掉进程,其实该进程在后台还在运行?

“进程还在”与“正在持续使用 CPU”要分开看。按 Home 或 Back 离开界面后,进程可能保留,也可能随后被系统回收;进程重要性取决于当时仍活跃的组件和依赖,不能只由一个按键决定。

  1. Back:处理页面或任务的返回,不保证结束进程。Android 12 起的根启动 Activity 行为见前文。
  2. Home:通常将任务留在后台,便于返回。Activity 状态可能被保留,但后台保留不是永久承诺。
  3. 最近任务清理:移除任务与结束进程要分别确认,厂商还可能附加自己的策略。
  4. 强制停止:停止应用并进入 stopped 状态,与普通进程回收不同。

Android 进程生命周期文档要求缓存进程停止工作,并说明 Android 13(API 33)起,缓存进程可能只获得有限执行时间,甚至不能执行。音乐播放、导航等用户需要的后台工作,应使用符合相应版本限制的组件和 API,不能靠“进程还在”保证继续运行。

对普通用户来说,临时切换应用可以用 Home 或手势,返回上一页则用 Back。按 Android 用户帮助的建议,通常不需要主动关闭正常工作的应用,更不必为了把 RAM 数字清空而反复“一键全杀”;这样可能让下次使用重新初始化。遇到某个应用异常耗电、无响应或后台行为不符合预期,再针对它检查设置或强制停止,注意这可能中断播放、上传和提醒。

我当时很反感“全家桶相互唤醒”:一个应用被杀了,另一个又偷偷把它拉起来,资源照样占着。这是当年的使用和排查经历。厂商会对这类行为施加限制,但具体名单与策略并不统一,不能由下面的配图推断任何应用当前仍有相同行为。

原文用于表达“全家桶”的历史配图,不是进程测量结果

那么保留后台进程,对下次启动又有什么帮助呢?

智能手机无需将程序彻底关掉,可以减少再启动的时间。是这样吗?

保留进程和已有界面,通常能省去部分重新初始化工作,这正是缓存的用途。不过“进程没有被杀”并不自动等于热启动,速度也不只取决于是否重新创建进程。

系统会按进程重要性和内存压力回收进程。应用应及时释放不再需要的资源,但不能依赖“被杀前一定先收到低内存通知”,释放缓存也不能保证自己存活。Android 14(API 34)起,onLowMemory() 不再调用,onTrimMemory() 的部分运行中及严重后台压力级别也不再通知;这些过时接口/常量在 API 35 标为弃用。TRIM_MEMORY_UI_HIDDEN 和 TRIM_MEMORY_BACKGROUND 仍有各自的生命周期含义,见 ComponentCallbacks2和本博客的更新说明。

下面这段保留的是我在 2018 年的感受,其中 100–400 MB 的说法没有附完整测量条件,不能作为今天的应用内存基准:

但是……………..凡是总有个但是,理想是丰满的,现实是很残酷的。严格按照Google想的那一套去做的应用不多,国内开发者对内存的敏感程度很低,导致很多应用程序跑起来分分钟就100-200MB 了,墨迹天气这样的应用,400m 妥妥的(不好意思又黑了墨迹天气) 。所以手机低内存的情况非常常见,所以低内存的情况会很频繁。这时候你再起一个应用,申请内存的时候发现内存不够,就开始杀应用了。

所以经常会出现你在看电子书,突然这时候微信来了个消息,你切过去回了个消息,打开相机拍了个照,然后发给朋友,又发了条微博,再回来看书的时候发现电子书已经挂了,正在重新加载程序….WLGQ…

这样的体验说明后台状态没有完整保留下来,但具体原因还要看系统压力、应用自身行为和厂商策略。关闭不需要的高负载任务可能有帮助,反复清空所有缓存进程却会把阅读应用也一起清掉。系统和应用应共同做好状态保存与恢复,不能保证某个“重要应用”永远不被杀。

按照官方启动状态说明,可以先区分三个常见场景:

  1. 冷启动:需要新建应用进程,再完成应用、Activity 和界面初始化。
  2. 温启动:例如进程仍在,但目标 Activity 需要重新创建。
  3. 热启动:例如进程和 Activity 都还在,主要恢复到前台;仍可能有恢复、布局和绘制工作。

拿发动汽车作比喻:冷启动像先启动发动机再出发,热启动像车辆已就绪再出发。但这个比喻不能用来估算耗时,也不能把冷、热差值全部归给 Zygote 创建进程。

原文的汽车启动类比配图

关于 Android 内存的其他一些问题

前面留下的几个问题,可以从下面这些区别入手。

  1. Android 怎么管理内存? 应用的 GC 处理 Java/Kotlin 堆里不再可达的对象,原生分配有自己的释放机制;内核还会回收文件页、按配置使用 zRAM 等。压力持续升高时,系统可结束较低重要性的进程。Android 10 起 lmkd 支持 PSI 压力监测,Android 11 改进了对内存颠簸等情况的处理,具体依赖内核与设备配置,见 AOSP lmkd。GC、页回收和杀进程不是同一件事。
  2. 一个应用到底占多少? 先确认它有几个进程,再选统计口径。RSS 计算驻留页,共享页会在多个进程中重复出现;PSS 按共享者数量分摊共享页;USS 看进程独占的驻留页。Java 堆大小、原生分配量、PSS、图形内存也不能互相代替或直接全部相加。见 dumpsys meminfo 说明。
  3. 系统占多少? 不能简单用“总 RAM 减去几个应用的数字”。系统进程、内核、文件缓存、图形缓冲及共享/保留区域有不同归属,部分统计还会重叠。看同一版本、同一时点的系统汇总,并核对字段定义;截图里的 Free RAM 就不能当成纯空闲内存。
  4. 内存怎样影响体验? 容量不足、工作集过大或回收频繁,可能增加重载和等待。但“空闲少”本身不是故障,缓存占用也不是内存泄漏。判断泄漏要看不再需要的对象或分配是否仍被保留。
  5. 普通用户怎样处理? 正常切换即可,不把“一键全杀”当日常优化。针对确有异常的应用检查耗电和后台权限,保留自己需要的音乐、导航、上传等功能。
  6. 新手机要多大 RAM? 原文的 6/8 GB 建议已过期,也不存在对所有用户都合适的固定容量。应按实际多任务、游戏或本地模型等负载,以及设备的后台保留表现判断;虚拟扩展内存也不能按容量等同于物理 RAM。本文不提供未经实测的当前机型推荐。

开发者排查时,可先用下面两个只读入口区分应用和系统视角。将 PACKAGE_NAME 替换成实际包名,多进程应用要检查相关 PID;输出项目随系统版本变化:

1
2
adb shell dumpsys meminfo PACKAGE_NAME
adb shell dumpsys meminfo

Java/Kotlin 对象泄漏可以在可调试应用上用 Android Studio 的堆转储,或用 LeakCanary 的引用链分析定位。Android 10 起可使用 Perfetto heapprofd分析原生分配,但正式 user 构建上的目标应用须满足 profileable/debuggable 条件;采样分配数据不等于全部驻留内存,也不能当作 Java 引用图。系统压力则应结合进程退出、回收和时间线,不能只凭一张内存截图下结论。

原文手机配图,非当前购机推荐

内存相关的文章参考

  1. Android代码内存优化建议-Java官方篇
  2. Android代码内存优化建议-Android资源篇
  3. Android代码内存优化建议-Android官方篇
  4. Android代码内存优化建议-OnTrimMemory优化
  5. Android性能优化典范之Understanding Overdraw
  6. Android性能优化之过度绘制(一)
  7. Android性能优化之过度绘制(二)
  8. Android内存优化之一:MAT使用入门
  9. Android内存优化之二:MAT使用进阶
  10. Android内存优化之三:打开MAT中的Bitmap原图
  11. 关于 Android 系统流畅性的一些思考

关于我 && 博客

下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!

  1. 博主个人介绍 :里面有个人的微信和微信群链接。
  2. 本博客内容导航 :个人博客内容的一个导航。
  3. 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
  4. Android性能优化知识星球:付费社群已于 2026 年停止运营,不再招收新成员;此处保留历史介绍。

一个人可以走的更快 , 一群人可以走的更远

微信扫一扫

CATALOG
  1. 1. Android系统下关闭程序后,系统内存并不释放?
    1. 1.1. 点击Back键退出.
    2. 1.2. 在任务管理器中杀掉应用
    3. 1.3. 通过命令行或者开发者工具杀掉应用
  2. 2. 即使关掉后台进程,内存也增加不多?
  3. 3. 据说即使前台关掉进程,其实该进程在后台还在运行?
  4. 4. 智能手机无需将程序彻底关掉,可以减少再启动的时间。是这样吗?
  5. 5. 关于 Android 内存的其他一些问题
  6. 6. 内存相关的文章参考
  • 关于我 && 博客