除了 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:

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

同一个 PID 仍存在,分组变成 Cached,数值降到 12337 kB。这说明当时进程被保留了,不能仅据此判断它还在持续执行代码。这里的分组反映进程重要性,并不是 CPU 调度优先级;数值对应这类输出中的 PSS 统计,不是 Java 堆大小。
Back 通常处理当前页面或任务的返回,默认不会直接“杀整个进程”。Android 12(API 31)还改变了任务根部启动 Activity 的默认行为:对于声明 ACTION_MAIN 和 CATEGORY_LAUNCHER 的根 Activity,Back 会把任务移到后台,而不是结束它。其他 Activity 的返回以及应用自定义处理,需要分别看。见任务和返回栈说明。
在任务管理器中杀掉应用
从最近任务界面划走卡片,与设置里的“强制停止”不是同一个操作。厂商任务管理器可能额外清理进程,应用也可能因仍有服务或其他组件而保留,不能把某个 ROM 的行为推广到所有 Android 设备。
当时用的是魅族 MX4 Pro。打开同一个测试应用,再用任务管理器清理,得到下面的局部输出:

我当时据此判断测试进程被结束了。不过,这张裁图只显示该列表片段里已没有 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 | 括号中的 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 离开界面后,进程可能保留,也可能随后被系统回收;进程重要性取决于当时仍活跃的组件和依赖,不能只由一个按键决定。
- Back:处理页面或任务的返回,不保证结束进程。Android 12 起的根启动 Activity 行为见前文。
- Home:通常将任务留在后台,便于返回。Activity 状态可能被保留,但后台保留不是永久承诺。
- 最近任务清理:移除任务与结束进程要分别确认,厂商还可能附加自己的策略。
- 强制停止:停止应用并进入 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…
这样的体验说明后台状态没有完整保留下来,但具体原因还要看系统压力、应用自身行为和厂商策略。关闭不需要的高负载任务可能有帮助,反复清空所有缓存进程却会把阅读应用也一起清掉。系统和应用应共同做好状态保存与恢复,不能保证某个“重要应用”永远不被杀。
按照官方启动状态说明,可以先区分三个常见场景:
- 冷启动:需要新建应用进程,再完成应用、Activity 和界面初始化。
- 温启动:例如进程仍在,但目标 Activity 需要重新创建。
- 热启动:例如进程和 Activity 都还在,主要恢复到前台;仍可能有恢复、布局和绘制工作。
拿发动汽车作比喻:冷启动像先启动发动机再出发,热启动像车辆已就绪再出发。但这个比喻不能用来估算耗时,也不能把冷、热差值全部归给 Zygote 创建进程。

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

内存相关的文章参考
- Android代码内存优化建议-Java官方篇
- Android代码内存优化建议-Android资源篇
- Android代码内存优化建议-Android官方篇
- Android代码内存优化建议-OnTrimMemory优化
- Android性能优化典范之Understanding Overdraw
- Android性能优化之过度绘制(一)
- Android性能优化之过度绘制(二)
- Android内存优化之一:MAT使用入门
- Android内存优化之二:MAT使用进阶
- Android内存优化之三:打开MAT中的Bitmap原图
- 关于 Android 系统流畅性的一些思考
关于我 && 博客
下面是个人的介绍和相关的链接,期望与同行的各位多多交流,三人行,则必有我师!
- 博主个人介绍 :里面有个人的微信和微信群链接。
- 本博客内容导航 :个人博客内容的一个导航。
- 个人整理和搜集的优秀博客文章 - Android 性能优化必知必会 :欢迎大家自荐和推荐 (微信私聊即可)
- Android性能优化知识星球:付费社群已于 2026 年停止运营,不再招收新成员;此处保留历史介绍。
一个人可以走的更快 , 一群人可以走的更远
