Android内存占用情况分析
Android内存占用情况分析
本文主要讲解用系统自带工具分析android手机在运行时内存分部情况,当手机内存不足时,可以按照下面步骤分析到底是谁占用了内存。
查看手机剩余内存情况
在终端输入以下指令:
adb shell dumpsys meminfo
主要信息如下图:
查看手机剩余内存方法有很多,这个方法比较准确。
Total RAM为手机的总内存;
Free RAM为剩余内存:其中cached pss为后台缓冲进程,当系统内存不足或缓冲进程数目达到系统限制最大数时会杀掉(部分)以释放内存。cached为高速缓冲存储器的内存,这部分内存已经分配好了,但是系统为了节约频繁申请内存开销,free时会把一部分内存cache起来,当用户再次申请内存时可能会直接从缓冲拿一块出来。free为未分配的物理内存;
Used RAM为用户态使用总内存;
Lost RAM为内核态使用内存,比如OpenGL纹理内存、GPU占用内存、图形显示ION buffer都包含在Lost RAM里。
值得注意的是当Free RAM比较小时可以认为系统内存不足(有种情况不能确定就是:Lost RAM占用内存很大,Lost RAM可能是内核缓冲内存太多了导致Free RAM小,但是并不是内存足,因为当内存不足时kernel会释放缓存,可以通过echo 3 > /proc/sys/vm/drop_caches主动释放)。
如果想了解根据详细内存分配情况可以在终端输入:
adb shell cat /proc/meminfo
其中:
MemTotal: LowTotal与HighTotal总和,系统总可用RAM大小(即物理内存减去一些预留位和内核的二进制代码)
MmFree: LowFree与HighFree的总和,被系统留着未使用的内存
Buffers: 用来给文件做缓冲大小
Cached: 被高速缓冲存储器(cache memory)缓存的内存的大小(等于 diskcache minus SwapCache)
SwapCached: 被高速缓冲存储器(cache memory)用的交换空间的大小已经被交换出来的内存,但仍然被存放在swapfile中。用来在需要的时候很快的被替换而不需要再次打开I/O端口
Active: 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要否则不会被移作他用
Inactive: 在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径
HighTotal: 高内存,内核不能直接访问的这部分内存
HighFree: 高内存剩余大小
LowTotal: 底内存,内核能够直接访问的内存
LowFree: 低内存剩余大小
SwapTotal: 交换空间的总大小
SwapFree: 未被使用交换空间的大小
Dirty: 等待被写回到磁盘的内存大小
Writeback: 正在被写回到磁盘的内存大小
AnonPages:未映射页的内存大小
Mapped: 设备和文件等映射的大小
Slab: 内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗
SReclaimable:可收回Slab的大小
SUnreclaim: 不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)
PageTables: 管理内存分页页面的索引表的大小
NFS_Unstable: 不稳定页表的大小
VmallocTotal: 可以vmalloc虚拟内存大小
VmallocUsed: 已经被使用的虚拟内存大小
查看进程内存占用情况
top指令查看各进程内存
在终端输入:
adb shell top
查看某个进程内存
找到要查看的进程pid,在终端输入:
adb shell dumpsys meminfo pid
如上图,可以分别看到Native Heap、Dalvik Heap、PSS大小。