APP内存占用

一、内存管理

从操作系统的角度来说,内存就是一块数据存储区域,是可被操作系统调度的资源。在多任务(进程)的操作系统中,内存管理尤为重要,操作系统需要为每一个进程合理的分配内存资源。可以从操作系统对内存分配回收两方面来理解内存管理机制。

  • 分配机制:为每一个任务(进程)分配一个合理大小的内存块,保证每一个进程能够正常的运行,同时确保进程不会占用太多的内存。

  • 回收机制:当系统内存不足的时候,需要又一个合理的回收再分配机制,以保证新的进程可以正常运行。

二、Android内存管理

1、内存管理机制

android 系统是基于Linux 内核开发的开源操作系统,而linux系统的内存管理有其独特的动态存储管理机制。不过Android 系统对Linux 的内存管理机制进行了优化,Linux 系统会在进程活动停止后就结束该进程,而Android 把这些进程都保留在内存中,直到系统需要更多的内存位置。

2、分配机制

Android 为每个进程分配内存的时候,采用了弹性的分配方式,刚开始并不会一下分配很多内存给每个进程,而是给每个进程分配一个“够用”的量。这个量是根据每一个设备实际的物理内存大小决定的。

随着应用的运行,当发现当前的内存可能不够用了,这时Android会为每个进程分配一些额外的内存大小。但这些额外的大小也是有限度的,系统不可能为每一个App分配无限大小的内存。

Android 系统的宗旨是最大限度地让更多的进程存活在内存中,使得下一次用户再启动应用时,不需要重新创建进程,只需要恢复已有的进程就可以,减少应用的启动时间,提高用户体验。

3、回收机制

Android 对内存的使用方式是“尽最大限度的使用”,这一点继承了Linux的优点。Android会在内存中保存尽可能多的数据,即便有些进程不再使用了,但是它的数据还被存储在内存中,所以 Android现在不推荐显式的“退出”应用。

当Android 系统发现内存不够用,需要回收内存的时候,Android 系统就会需要杀死其他进程,来回收足够的内存,但是 Android 也不是随便杀死一个进程,比如说一个正在与用户交互的进程,这种后果是可怕的。所以 Android 会有限清理那些已经不再使用的进程,以保证最小的副作用。

三、内存分类

在Linux里,一个进程占用的内存有不同说法,具体有以下四种形式:

  • VSS - Virtual Set Size 虚拟耗用内存

  • RSS - Resident Set Size 实际使用物理内存

  • PSS - Proportional Set Size 按比例使用的物理内存

  • USS - Unique Set Size 进程独自占用的物理内存

1、VSS

VSS是单个进程全部可访问的地址空间,其大小可能包括还尚未在内存中驻留的部分。对于确定单个实际内存使用大小, VSS用处不大。

2、RSS

RSS 是单个进程实际占用的内存大小,RSS 不太准确的地方在于它包括该进程所使用共享库全部内存大小。 对于一个共享库,可能被多个进程使用,实际该共享库只会被装入内存一次。

3、PSS

PSS不同于 RSS,它只是按比例包含其所使用的共享库大小。 PSS相对于RSS 计算共享库内存大小是按比例的。例如:3个进程使用同一个占用 30 个内存页的共享库。对于三个进程中的任何一个,PSS 将只包含 10 个内存页。 PSS是一个非常有用的数字,对于系统中的整体内存使用是比较准确的统计。

4、USS

USS是单个进程私有的内存大小,即该进程独占的内存部分。USS揭示了一个特定进程在的真实内存增量大小。如果进程终止,USS就是实际被返还给系统的内存大小。

四、Android内存测试

1、获取设备内存信息

在Linux中,/proc是一个位于内存中的伪文件系统(in-menory-file system)。该目录下保存的不是真正的文件和目录,而是一些运行时信息,如系统内存、磁盘io、设备挂载信息和硬件配置信息等。

使用 adb shell cat /proc/meminfo 查看设备的整体内存使用情况。

部分参数含义:

  • MemTotal:表示可供系统支配的内存,系统从开机到加载完成,操作系统内核要保留一些内存,最后剩下可供系统支配的内存就是 MemTotal。
  • MemFree:表示系统尚未使用的内存。
  • MemAvailable:应用程序可用内存大小。

            系统中有些内存虽然已被使用但是可以回收的,比如cache可以回收,所以MemFree不能代表全部可用的内存,这部分可回收的内存加上MemFree才是系统可用的内存,即MemAvailable≈MemFree+系统回收内存。它是内核使用特定的算法计算出来的,是一个估值。它与MemFree 的关键区别点在于,MemFree 是系统层面, MemAvailable是应用程序层面。

  • Cached:缓冲区内存大小。
  • Buffers:缓冲区内存大小。

2、获取应用内存占用信息

连接设备,使用 adb shell procrank (手机需要root)来获取各个应用的 VSS、 RSS、PSS、USS

3、获取指定包的内存占用情况

    adb shell dumpsys meminfo [pkg or pid]

重点关注参数

一般情况下横轴仅需要关注 Pss Total 和 Private Dirty 列。Private Dirty 表示进程独占内存。

  • Native Heap:Native 代码分配的内存。Native 进程采用C/C++实现,不包含 dalvik 实例的 linux 进程,/system/bin/目录下面的程序文件运行后都是以 Native 进程形式存在的。
  • Dalvik Heap:Java 对象分配的占据内存

其他参数

  • Dalvik Other:类数据结构和索引占据内存。
  • Stack:栈内存
  • Ashmem:不以dalvik- 开头的内存区域,匿名共享内存用来提供共享内存通过分配一个多个进程可以共享的带名称的内存块。匿名共享内存(Anonymous Shared Memory-Ashmem)。Android 匿名共享内存是基于Linux 共享内存的,都是在tmpfs 文件系统上新建文件,并将其映射到不同的进程空间,从而达到共享内存的目的,只是Android 在 Linux 的基础上进行了改造,并借助 Binder+fd 文件描述实现了共享内存的传递。
  • Other dev:内部 driver 占用的内存
  • .so mmap:C库代码占用的内存
  • .jar mmap:java文件代码占用的内存
  • .apk mmap:apk代码占用的内存
  • .ttf mmap:ttf 文件代码占用的内存
  • .dex mmap:dev 文件代码占用内存。类函数的代码和常量占用的内存,dex map 是映射 classex.dex 文件,Dalvik 虚拟机从 dex 文件加载类信息和字符串常量等。Dex 文件有索引区和 Data 区
  • Other mmap:其他文件占用的内存
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值