Android内存管理机制
1. java内存管理机制
1.1 java内存分配
方法区
虚拟机栈
本地方法栈
堆
程序计数器
1.2 java内存回收算法
1.2.1标记-清除算法
标记出所有需要回收的对象
统一回收所有被标记的对象
缺点:
标记-和清除效率不高
会产生大量不连续的内存碎片,出现内存空洞
1.2.1复制算法
将内存划分为大小相等的两块内存
一块内存用完之后复制存活对象到另一块
清理另一块内存
优缺点:
实现简单,运行高效(相对前一种来说)
浪费一半空间,代价大
1.2.2 标记-整理算法
标记过程与“标记-清除”算法 一样
存活对象往一端进行移动
清理其余内存
优缺点:
避免标记-清理导致的内存碎片
避免复制算法 的空间浪费
1.2.3 分代收集算法
结合多种收集算法 优势
新生代对象存活率低,用复制算法
老年代对象存活率高,用 标记-整理算法
2.Android内存管理机制
内存弹性分配,分配值与最大值受具体设备影响
OOM场景:内存真正不足、可用内存不足
Dalvik 与 Art区别
Dalvik 固定一种回收算法
Art回收算法可运行期选择
Art具备内存整理能力,减少内存空洞
Low Memory Killer
进程分类:
前台进程(foreground process):需要用户当前正在进行的操作。一般满足以下条件:
1. 屏幕顶层运行Activity(处于onResume()状态),用户正与之交互
2. 有BroadcastReceiver正在执行代码
3. 有Service在其回调方法(onCreate()、onStart()、onDestroy())中正在执行代码
这种进程较少,一般来作为最后的手段来回收内存
可视进程(visible process):做用户当前意识到的工作。一般满足以下条件:
1. 屏幕上显示Activity,但不可操作(处于onPause()状态)
2. 有service通过调用Service.startForeground(),作为一个前台服务运行
3. 含有用户意识到的特定的服务,如动态壁纸、输入法等
这些进程很重要,一般不会杀死,除非这样做可以使得所有前台进程存活。
服务进程(service process):含有以startService()方法启动的service。虽然该进程用户不直接可见,但是它们
一般做一些用户关注的事情(如数据的上传与下载)。
这些进程一般不会杀死,除非系统内存不足以保持前台进程和可视进程的运行。
对于长时间运行的service(如30分钟以上),系统会考虑将之降级为缓存进程,避免长时间运行导致内存
泄漏或其他问题,占用过多RAM以至于系统无法分配充足资源给缓存进程。
缓存/后台进程(cached/background process):一般来说包含以下条件:
1. 包含多个Activity实例,但是都不可见(处于onStop()且已返回)。
系统如有内存需要,可随意杀死。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】