android kswapd0 白话理解

Android 内存管理的一套机制很复杂,这里只是简单梳理一下kswapd0、swapniss、swap 是什么以及它们之间的关系。

1 什么是 kswapd0

简单来说,kswapd0 是一个进程,负责在 Android 系统内存紧张时进行内存回收。

2 kswapd0 回收什么内存

首先我们知道,Android 的内存分为匿名页和文件页。
文件页:也即 File-backed Page,从名字理解,就是在磁盘上有文件对应的页,包括缓存、缓冲以及通过内存映射获得的页。

脏页:当文件页被修改过后,并且暂时还没写将数据写入磁盘,页中的数据与磁盘不一致,这样的页就是脏页。在回收前,需要先回写到磁盘。

匿名页:Anonymous Page,没有磁盘文件与之对应,主要是应用程序分配的堆内存、栈内存。
匿名页和文件页,可按使用的活跃情况分为 Active 和 Inactive,在回收的时候优先回收 InActive 页。
在这里插入图片描述
(1)对于文件页,因为有磁盘文件对应,回收的时候可以直接释放掉,但下次再使用的时候又要从磁盘读入,会产生 IO。
(2)对于匿名页,回收是将其 swpa out 到 swap 分区中,也就是将其压缩存放,在下次使用时,只需要进行解压,swap in 回内存空间。

3 匿名页和文件页的回收倾向 swapniss

swapniss 是回收的匿名页与文件页的比值,值越大,越倾向于回收匿名页。当该值为 100 时,二者回收比例相同。

4 swap是什么

swap 其实也是 Android 中的一块内存,系统专门划分出来的用于存放压缩后(swap out)的匿名页。其中的内存不能直接用,需要解压后(swap in)才能用。这个与 linux 的不同,linux 的 swap 是一块磁盘。

5 lmkd 又是什么

Low Memory Killer Daemon,当应用不存在了,它占用的内存自然会释放。基于此,LMKD 通过杀死最不重要进程来应对高内存压力,这其实是另一套机制了,当进程被杀死后,它所持有的内存,不管是文件页,还是匿名页(包括swap空间中的)都会被释放。

猜你喜欢

转载自blog.csdn.net/hejnhong/article/details/124333385