性能功耗
性能功耗 启动(冷启动进程,home和back各启动的activity),内存,功耗
GC
一,GC的原因,一共有四种类型
GC_CONCURRENT 当你的堆内存快被用完的时候,就会触发这个GC回收
GC_FOR_MALLOC 堆内存已经满了,同时又要试图分配新的内存,所以系统要回收内存
GC_EXTERNAL_ALLOC 在Android3.0 (Honeycomb)以前,释放通过外部内存(比如在2.3以前,产生的Bitmap对象存储在Native Memory中)时产生。Android3.0和更高版本中不再有这种类型的内存分配了。
GC_EXPLICIT 调用System.gc时产生,上图中就是点击Cause GC按钮手动触发垃圾回收器产生的log信息
二,freed 1413K表示GC释放了1434K的内存
三,20% free 9349K/11644K, 20%表示目前可分配内存占的比例,9349K表示当前活动对象所占内存,11644K表示Heap的大小
四,paused 8ms + 3ms, total 71ms,则表示触发GC应用暂停的时间和GC总共消耗的时间
adb shell dumpsys meminfo +packagename
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Dalvik Heap 43786 42916 0 0 77208 73931 3277
其中size是需要的内存,而allocated是分配了的内存,对应的2列分别是native和dalvik,当总数也就是total这一列超过单个程序内存的最大限制时,OOM就很有可能会出现了。
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: 已经被使用的虚拟内存大小。
adb shell procrank
可以看出各个应用/进程内存占用情况,期中:
VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS- Proportional Set Size 实际使用的物理内(USS大小 + 私有库大小 + 比例分配共享库大小,比例分配共享库占用的内存,比如3个进程共用一个占用30M共享库,那么这个库只有10M计算到进程PSS中)
USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS,主要看PSS,它基本能反映出应用实际占用内存大小,当内存不足主要要关注这个值比较大的进程。当然有时候问题比较复杂就是:各个进程的PSS都很小但是系统剩余内存不足,比如运行大型游戏,游戏可能申请了大量的纹理,纹理内存主要是在VSS。这个时候需要用下面方法进行查看详细分布情况。