MediaTek On-Line | Loginhttps://online.mediatek.com/QuickStart/QS00227#QSS02376
anon pages 匿名页 :没有文件背景的页面,如stack,heap,数据段等,他们没有对应的硬盘文件,因此如果要交换,只能交换到虚拟内存 zram或者Linux的swap硬盘分区。
文件页:有文件背景的页面,比如代码段、比如read/write方法读写的文件、比如mmap读写的文件;他们有对应的硬盘文件,因此如果要交换,可以直接和硬盘对应的文件进行交换。内存紧张时,非dirty的文件页可以直接drop掉,所以这个也算作MemAvailable中。
文件页另外一种解释:缓存和缓冲区,就属于可回收内存。它们在内存管理中,通常被叫做文件页(File-backed Page),此外除了缓存和缓冲区,通过内存映射获取的文件映射页,也是一种常见的文件页。
mmap()系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。而Posix或System V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。
kernel total =MEMINFO_SHMEM+MEMINFO_SLAB+MEMINFO_VM_ALLOC_USED+MEMINFO_PAGE_TABLES+MEMINFO_KERNEL_STACK
mmap:
此外va还会对应一个backup file,作为swap-in/out时的备份存储。这个va和backup file之间的对应关系就叫做memory mapping,我们可以利用这个机制做文件读取,Memory mapping的调用函数是mmap。
它有两种用法:
第一种是映射文件到内存做读取, 这时提供一个文件句柄,然后将文件内容映射到一段虚拟内存地址空间,这样就做到了通过访问虚拟地址空间--造成缺页—swapin backup file的方式来根据需要读取文件。他相比传统的文件读取效率更高。
第二种是创建一个匿名映射,匿名映射没有backupfile,只是单纯分配一块虚拟内存空间,这其实是android上调用new一个对象做的事情,我们new一块int的数组,事实上在new后很可能是通过mmap分配了一块虚拟内存空间,而只有当第一次写入的时候才触发缺页而占用真正的物理内存,所以统计android的物理内存占用不是看new了多少,或者文件映射了多少,而是实际上虚拟内存缺页了多少。
Malloc函数当申请小内存时使用sbrk来分配内存,大内存则使用mmap申请,
Private Dirty和Private Clean则是完全该进程自己(而不包括和别人共享部分)占用的物理内存,clean是指那部分可能被swap的内存部分(即前面说到的拥有backup文件,mmap之后一直保持只读状态,他们具有被swap out的可能,比如你的so库文件。),而dirty部分就是除clean之外那些不能被swap的内存。Private Dirty通常是你的进程内存最需要优化的地方,因为他们是大头。
Swapped Dirty指的并不是被swap-out出去的内存,而是android系统中zram机制压缩掉的部分Private Dirty部分的不常用物理内存,这个重要度等同于Private Dirty,因为哪些Private Dirty会被压缩不能被控制,所以这部分多通常也是Private Dirty 的。
因为PSS中已经包含了Private Dirty和Private Clean,但是没包含swapped dity,所以最终衡量你的进程对物理内存的占用应该是取PSS+Swapped Dirty
Ashmem:进程的匿名共享内存 Anonymous Shared Memory
Native Heap:这是C/C++层直接通过malloc分配的内存
Dalvik Heap/other:这是android的java虚拟机分配的内存