惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
U
Unit 42
The Register - Security
The Register - Security
S
Security Affairs
博客园 - 【当耐特】
Latest news
Latest news
爱范儿
爱范儿
T
The Exploit Database - CXSecurity.com
F
Full Disclosure
C
Cisco Blogs
宝玉的分享
宝玉的分享
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LangChain Blog
P
Privacy & Cybersecurity Law Blog
腾讯CDC
C
CXSECURITY Database RSS Feed - CXSecurity.com
V
Vulnerabilities – Threatpost
Jina AI
Jina AI
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 叶小钗
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园_首页
博客园 - 三生石上(FineUI控件)
D
DataBreaches.Net
WordPress大学
WordPress大学
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Microsoft Security Blog
Microsoft Security Blog
N
News and Events Feed by Topic
Recorded Future
Recorded Future
Scott Helme
Scott Helme
Hacker News: Ask HN
Hacker News: Ask HN
Webroot Blog
Webroot Blog
AWS News Blog
AWS News Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
人人都是产品经理
人人都是产品经理
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tor Project blog
F
Fortinet All Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
H
Hacker News: Front Page
J
Java Code Geeks
A
About on SuperTechFans
The GitHub Blog
The GitHub Blog
博客园 - 聂微东
Last Week in AI
Last Week in AI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
W
WeLiveSecurity
V2EX - 技术
V2EX - 技术
T
Troy Hunt's Blog
Attack and Defense Labs
Attack and Defense Labs

Android Performance

SmartPerfetto 架构文章 Q&A:8 个深度技术问答 从 Trace 到洞察:SmartPerfetto AI Agent 的 Harness Engineering 实战 OpenClaw 常见问题解答:Token 消耗、能干什么、本地模型、隐私安全、使用体验 我把 OpenClaw 跑在本地三周后,发现它根本不是聊天机器人 Android Perfetto 系列 10 - Binder 调度与锁竞争 Android Perfetto 系列 9 - CPU 信息解读 Android Perfetto 系列 8:深入理解 Vsync 机制与性能分析 Android Perfetto 系列 7 - MainThread 和 RenderThread 解读 Android Perfetto 系列 6:为什么是 120Hz?高刷新率的优势与挑战 Android Perfetto 系列 5:Android App 基于 Choreographer 的渲染流程 Android Perfetto 系列 4:使用命令行在本地打开超大 Trace Android ANR 系列 3 :ANR 案例分享 Android ANR 系列 2 :ANR 分析套路和关键 Log 介绍 Android ANR 系列 1 :理解 Android ANR 设计思想 Android Perfetto 系列 3:熟悉 Perfetto View Android Perfetto 系列 2:Perfetto Trace 抓取 Android Perfetto 系列 1:Perfetto 工具简介 Android Perfetto 系列目录 2023 年的方方面面 关于 The Android Performance 知识星球介绍 The Performance Design Of OS OS 设计之性能设计 当 App 有了系统权限,真的可以为所欲为? The Performance 星球茶话会 - 第一期 Systrace 线程 CPU 运行状态分析技巧 - Sleep 和 Uninterruptible Sleep 篇 Systrace 线程 CPU 运行状态分析技巧 - Running 篇 Systrace 线程 CPU 运行状态分析技巧 - Runnable 篇 Android 性能优化的术、道、器 Techniques, Philosophy, and Tools for Android Performance Optimization 回顾 2021 一本讲 Android 流畅性的书,应该有什么内容? Android 系统开发系列(1):Android 12 源代码下载、编译和刷机 Android Systrace 响应速度实战 3 :响应速度延伸知识 Android Systrace 响应速度实战 2 :响应速度实战分析-以启动速度为例 Android Systrace 响应速度实战 1 :了解响应速度原理 Android Systrace 流畅性实战 3 :卡顿分析过程中的一些疑问 Android Systrace 流畅性实战 2 :案例分析 - MIUI 桌面滑动卡顿分析 Android Systrace 流畅性实战 1 :了解卡顿原理 华为手机刷微博体验更好?技术角度的一些分析和思考 一个「闰」字引发的事故 - 三星系统重启分析 Android App 链式唤醒分析 Android Systrace 基础知识 - SurfaceFlinger 解读 Android 开发者学习路线(2020 版本) 我的 2020 年读书单 Android Systrace 基础知识 - CPU Info 解读 Android Systrace 基础知识 - Triple Buffer 解读 Android Systrace 基础知识 - Binder 和锁竞争解读 「置顶」博客文章目录 Android Systrace 基础知识 - Vsync 解读 Android App 启动优化全记录 Android Systrace 基础知识 - MainThread 和 RenderThread 解读 Android Systrace 基础知识 - Input 解读 Android 中的“后台无效动画“行为分析 Android 基于 Choreographer 的渲染机制详解 Android 中的卡顿丢帧原因概述 - 低内存篇 Android 桌面被杀问题分析案例 Android 中的卡顿丢帧原因概述 - 应用篇 Android 中的卡顿丢帧原因概述 - 系统篇 Android 中的卡顿丢帧原因概述 - 方法论 Android 中的 Activity Launch Mode 详解 Android 中的 Hardware Layer 详解 Android Systrace 基础知识 -- 分析 Systrace 预备知识 Android Systrace 基础知识 - SystemServer 解读 Android Systrace 基础知识 -- Systrace 简介 Android Systrace 基础知识 -- Why 60 fps ? Android Systrace -- 系列文章目录 Android 新的流畅体验,90Hz 漫谈 利器 - 高效工具推荐 Android 无障碍服务导致的整机卡顿案例分析 2018 年度好物推荐 - 给辛勤工作的自己一点奖励 Android 系统开发源码环境搭建 陆奇:除了好代码,工程师怎样才算优秀? 程序员的修炼-08-阅读之美 程序员的修炼-07-游戏与编程 程序员的修炼-06-互联网那些事 程序员的修炼-05-了解你的用户 程序员的修炼-04-关于测试的一些思考 程序员的修炼-03-Web 设计原则 程序员的修炼-02-编程之道 程序员的修炼-01-绝地反击之术 关于 Android 系统流畅性的一些思考 知乎 救救你的 StartingWindow 「置顶」Android 性能优化必知必会 2017 年度好物推荐 - 给辛勤工作的自己一点奖励 2017 Android Bottom navigation 规范二:样式、行为与规格 Android Bottom Navigation 规范一:使用方法 Android 中如何计算 App 的启动时间? Android 应用启动优化:一种 DelayLoad 的实现和原理(下篇) Android 应用启动优化 - 一种 DelayLoad 的实现和原理(上篇) Android hwui 中 RenderThread 工作流程 Java7 HashMap 源码分析 Android 代码内存优化建议 - OnTrimMemory 优化 Android 代码内存优化建议 - Android 资源篇 Android 代码内存优化建议 - Android 官方篇 Android 代码内存优化建议 - Java 官方篇 Nexus6 with Android M 开启多窗口模式 细说 Java 单例模式 Android 性能优化典范 - Profile GPU Rendering Android 性能优化典范 - Understanding VSYNC
Android 系统不释放内存吗?
Gracker · 2018-09-13 · via Android Performance

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

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

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

这篇文章面向普通用户解释 Android 内存管理,核心结论仍然成立:进程是否还在、内存是否立即释放,取决于退出方式、进程优先级、系统内存压力和厂商策略。技术排查入口则要更新:早期常用任务管理器、dumpsys meminfo、MAT 去理解内存;现在看 App 内存泄漏优先用 Android Studio Memory Profiler/LeakCanary,看系统内存压力要结合 dumpsys meminfo、LMK/Android Vitals、Perfetto memory/native heap、进程优先级和厂商后台策略。不要只用“剩余内存变多/变少”判断 Android 是否健康,现代系统会主动用内存做缓存来换取启动和切换速度。

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

这个是不准确的,只能说对了一半. 你所描述的”android系统下关闭程序”,指的是怎么个关闭法呢?目前阶段有好几种关闭程序的方法:

点击Back键退出.

这种退出的方法, 进程是否被杀掉,取决于这个应用程序的实现. 举个栗子,如果你创建一个空的应用, 这时候查看系统内存信息(包名为com.exmaple.gaojianwu.myapplication,pid为5708,内存为13910kb):

可以看到,这个应用程序的pid为5708, 其优先级为Foreground,即前台程序.

这时候我们点击Back键退出,然后再查看系统的内存信息(adb shell dumpsys meminfo)

我们看到,这个程序在 Back 键之后,其进程 5708 依旧是存在的.只是其进程优先级变成了Cache.其占用内存变成了 12337kb,和之前的 13910kb 相比是变小了一些. 但是大部分内存是没有被释放掉的.

在任务管理器中杀掉应用

在任务管理器中杀掉应用,这个结果是不一致的,其取决于这个OS的任务管理器的实现,大部分国内的厂家都会对任务管理器进行定制,以达到更有效的杀掉应用的效果.一般来说厂家定制的任务管理器都会比较暴力,除了少数白名单,其他的应用一概直接将进程杀掉

我们以上面的那个测试程序为例,打开这个程序之后, 其进程优先级为Foreground,这时候我们直接调用任务管理器杀掉改程序(以魅族MX4 Pro为栗子):

可以看到用任务管理器杀掉之后, 整个应用程序的进程都被杀掉了.

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

我们可以通过 adb shell am force-stop 包名来杀掉这个程序,其结果也是进程直接被杀掉,IDE(比如Android Studio)选择一个进程后,点击图中的按钮

也是可以干掉这个进程的. 这时候进程是被直接杀掉的。

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

这个不对,一个进程被杀死后,其内存会被释放掉的,不管是虚拟机内存还是 Native 内存还是图像所申请的内存,都会被系统回收,放到可用内存中。

我们以知乎 App Android客户端为栗子,打开这个程序之前,系统剩余内存 1.8G:

打开知乎之前,系统剩余内存

打开知乎这个程序之后,系统剩余内存:

打开知乎之后,系统剩余内存

知乎占用的内存:

知乎内存占用

使用任务管理器杀掉知乎(直接杀掉进程),系统剩余内存:

杀掉知乎知乎系统剩余内存

可以看到,杀掉进程之后,系统可用内存是会增加的。

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

这个和第一条一样,取决于你关掉进程的方法:

  1. 如果是按 Back 键,那么该进程还是会在后台。是否在运行,则要取决于这个应用的行为,有的应用 Back 到后台之后,其优先级会降到 Cache,系统内存不足或者触发 Cache 进程的数量限制,都会被系统直接杀掉,回收内存;有的应用 Back 到后台之后,会触发一些后台任务,起个 Service 之类的,还是会继续运行,比如导航软件和听歌软件
  2. 如果是按 Home 键,那么该进程依然会在后台,其大部分资源都没有释放,包括 Activity、Service 等。是否在运行,与 Back 到后台的行为一样,取决于应用的行为。
  3. 如果是被任务管理器或者命令行(Force Stop)杀掉,那么除非自启动(很多国内的应用被杀之后都会走自启动模式,同样很多国内的手机厂商,都会禁止应用被杀后走自启动模式,或者被其他进程唤醒,一般有名单进行控制,名单内的可以自启动,其他的自己想办法),应用是不会在后台运行的。

从上面的三个逻辑来看,用户最佳的使用方法应该遵循下面的建议:

  1. 如果是正在使用的应用,临时切出去干个别的事情,一会还要切回来,那么使用 Home 键把当前应用退到后台最佳
  2. 如果是不想看了,想退出应用了,那么使用 Back 键把当前应用退到后台最佳
  3. 如果不希望这个应用退到后台之后还有可能运行,或者想释放内存,那么用任务管理器把这个应用直接杀掉最好(推荐一键全杀,国内的 Rom 基本都有)

上面也讲到,国内的手机厂商,都会禁止应用被杀后走自启动模式,或者被其他进程唤醒,一般有名单进行控制,这样做是为什么呢?厂商这么做无非是为了限制应用对资源的占用,一个应用退到后台之后,系统肯定是希望其占用最少的资源,能不占资源最好(cpu、gpu、io、memory),但是国内的部分应用却没那么安分守己,大家肯定听说过全家桶和相互唤醒,应用被杀了没问题,我另外一个应用偷偷把你拉起来就可以了,这拉起来的过程就占用了系统的资源,可能会导致前台应用出现卡顿,或者导致整机内存不足,所以厂商对应用的限制是无可厚非的。

百度全家桶

那么应用为什么要抱团取暖,相互唤醒呢?第四个问题就是说这个的。

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

这句话没毛病,但是是有前提的,前提就是,如果这个应用在后台可以安分守己,至于现实嘛..不说大家也知道,参考百度全家桶

Android设计的时候,确实是想让大家不去关心内存问题,Android会有一套自己的内存管理机制,在内存不足的时候通过优先级干掉一些应用。每个应用在接收到内存不足的信号,需要根据内存不足的程度,来释放掉一部分内存.以保持自己的进程不被杀死,这样下次启动的时候就不用去fork zygote,这样的话,下一次启动的时间确实会少很多,也就是大家常说的冷启动和热启动的差距。

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

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

这时候你就发现限制后台进程的重要性了,把不重要的进程直接干掉,限制应用的自启动和相互唤醒,保证重要的进程不会被系统杀掉,也就保证了用户的基本使用体验。

所以说不重要的程序是需要在使用结束后直接干掉的.一劳永逸,麻麻再也不用担心这货偷跑流量/后台安装程序/占内存/占 CPU 了….

再说后半句: 可以减少启动的时间. 这个是对的, 如果一个应用程序的进程没有被杀死,那么下一次启动这个应用程序的时候,就不需要去创建这个进程了(fork zygote,这个耗时还是蛮多的), 而是直接在这个进程中创建对应的组件即可(Android四大组件),速度比冷启动要快很多。

以汽车发动为例:

  1. 冷启动相当于 上车 -> 拧钥匙 -> 等发动机启动 -> 踩刹车换挡 -> 放手刹 -> Go
  2. 热启动相当于 上车 -> 踩刹车换挡 -> 放手刹 -> Go

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

这里来简单解答一下第一段中提到的那些问题

  1. Android 系统是怎么管理内存的呢? – 这个嘛,后续再详细讲
  2. 应用到底占了多少内存? – 这个嘛,后续再详细讲
  3. 系统到底占了多少内存? – 这个嘛,后续再详细讲
  4. 内存对我手机的使用体验有什么影响?– 低内存会影响整机的流畅性和响应速度,也会导致杀应用变得很频繁,用户体验差。
  5. 到底怎么才能用好 Android 手机?– 买 Android 旗舰,多用任务管理器的全杀功能,尽量禁止应用后台运行(Flyme 用户可以在手机关机里面设置)
  6. 换新手机换多大内存的会比较合适呢? – 越大越好,6G 起步,8G 最佳。

内存相关的文章参考

  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性能优化知识星球 : 欢迎加入,多谢支持~

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

微信扫一扫