Android的内存简单总结

2022-04-05  本文已影响0人  风吹尘埃

1.内存

内存(Memory)是计算机的重要部件,也称内存储器和主存储器,它用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存性能的强弱影响计算机整体发挥的水平。只要计算机开始运行,操作系统就会把需要运算的数据从内存调到CPU中进行运算,当运算完成,CPU将结果传送出来。

CPU只能访问其寄存器(Register)和内存(Memory), 无法直接访问硬盘(Disk)。 存储在硬盘上的数据必须首先传输到内存中才能被CPU访问。从访问速度来看,对寄存器的访问非常快,通常为1纳秒; 对内存的访问相对较慢,通常为100纳秒(使用缓存加速的情况下);而对硬盘驱动器的访问速度最慢,通常为10毫秒。

当一个程序加载到内存中时,它由四个内存区域组成:

2.有哪些内存管理技术

3.Android的进程内存分配

Android 平台在运行时不会浪费可用的内存。它会一直尝试利用所有可用内存。

内存类型

内存页面

RAM 分为多个“页面”。通常,每个页面为 4KB 的内存。 系统会将页面视为“可用”或“已使用”。可用页面是未使用的 RAM。已使用的页面是系统目前正在使用的 RAM,并分为以下类别:

内存不足管理

内核交换守护进程(kswapd)

内核交换守护进程 (kswapd) 是 Linux 内核的一部分,用于将已使用内存转换为可用内存。当设备上的可用内存不足时,该守护进程将变为活动状态。Linux 内核设有可用内存上下限阈值。当可用内存降至下限阈值以下时,kswapd 开始回收内存。当可用内存达到上限阈值时,kswapd 停止回收内存。

低内存终止守护进程

kswapd 无法为系统释放足够的内存时,系统会使用 onTrimMemory() 通知应用内存不足(通过继承 ComponentCallbacks2 可以监听到此回调,这时对不可见,不关键的资源进行释放,如Glide在收到此回调时会对缓存的图片进行释放),应该减少其分配量。如果内存依旧不足,内核会终止LRU中的进程以释放内存。它会使用低内存终止守护进程 (LMK) 来执行此操作。

LMK 使用一个名为 oom_adj_score 的“内存不足”分值来确定正在运行的进程的优先级,以此决定要终止的进程。最高得分的进程最先被终止。后台应用最先被终止,系统进程最后被终止。

终止顺序:

  1. 后台应用:之前运行过且当前不处于活动状态的应用。LMK 将首先从具有最高 oom_adj_score 的应用开始终止后台应用。
  2. 上一个应用:最近用过的后台应用。上一个应用比后台应用具有更高的优先级(得分更低),因为相比某个后台应用,用户更有可能切换到上一个应用。
  3. 主屏幕应用(桌面):这是启动器应用。终止该应用会使壁纸消失。
  4. 服务:服务由应用启动,可能包括同步或上传到云端。
  5. 可觉察的应用:用户可通过某种方式察觉到的非前台应用,例如运行一个显示小界面的搜索进程或听音乐。
  6. 前台应用:当前正在使用的应用。终止前台应用看起来就像是应用崩溃了,可能会向用户提示设备出了问题。
  7. 持久性(服务):这些是设备的核心服务,例如电话和 WLAN。
  8. 系统:系统进程。这些进程被终止后,手机可能看起来即将重新启动。
  9. 原生:系统使用的极低级别的进程(例如,kswapd)。

4.Android内存分配机制

Android 运行时 (ART) 和 Dalvik 虚拟机使用分页和内存映射来管理内存

垃圾回收

ART 或 Dalvik 虚拟机之类的受管内存环境会跟踪每次内存分配。一旦确定程序不再使用某块内存,它就会将该内存重新释放到堆中,无需程序员进行任何干预。这种回收受管内存环境中的未使用内存的机制称为“垃圾回收”。垃圾回收有两个目标:在程序中查找将来无法访问的数据对象,并回收这些对象使用的资源。

Android 的内存堆是分代的,这意味着它会根据分配对象的预期寿命和大小跟踪不同的分配存储分区。例如,最近分配的对象属于“新生代”。当某个对象保持活动状态达足够长的时间时,可将其提升为较老代,然后是永久代

堆的每一代对相应对象可占用的内存量都有其自身的专用上限。每当一代开始填满时,系统便会执行垃圾回收事件以释放内存。垃圾回收的持续时间取决于它回收的是哪一代对象以及每一代有多少个活动对象

共享内存

6549967-538b41d98ae7cb0c.jpg

分配和回收内存

[dalvik.vm.heapgrowthlimit]: [192m]// 单个进程的最大可用堆(不包含Native堆)
[dalvik.vm.heapmaxfree]: [8m]// 堆最大空闲内存
[dalvik.vm.heapminfree]: [512k]// 堆最小空闲内存
[dalvik.vm.heapsize]: [512m]// 理论上可用的最大内存
[dalvik.vm.heapstartsize]: [8m]// 表示进程启动后,堆得初始内存大小,它影响初始启动的流畅度。
[dalvik.vm.heaptargetutilization]: [0.75]// 内存利用率

限制应用内存

5.管理应用内存

监控可用内存和内存使用量

优化代码

移除会占用大量内存的资源和库

参考

Android 内存管理机制
内存管理概览
管理应用内存
认真分析mmap:是什么 为什么 怎么用
谈谈Android的内存管理机制
ART堆大小设置及动态调整过程分析(Android 8.1
进程间的内存分配
查看基于Android 系统单个进程内存、CPU使用情况的几种方法

上一篇 下一篇

猜你喜欢

热点阅读