获取系统的内存信息
1、读取/proc/meminfo获取内存信息
adb shell cat /proc/meminfo
1.1、MemTotal:内存总数
系统从加电开始到引导完成,BIOS等要保留一些内存,内核要保留一些内存,最后剩下可供系统支配的内存就是MemTotal。这个值在系统运行期间一般是固定不变的。
1.2、MemFree:空闲内存数
表示系统尚未使用的内存。MemUsed=MemTotal-MemFree就是已被用掉的内存。
1.3、Cached:缓存区内存数
当你读写文件的时候,Linux内核为了提高读写性能与速度,会将文件在内存中进行缓存,也就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存会很少。其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有内存可用。
1.4、MemAvailable:可用内存数
应用程序可用内存数。系统中有些内存虽然已被使用但是可以回收的,比如cache/buffer、都有一部分可以回收,所以MemFree不能代表全部可用的内存,这部分可回收的内存加上MemFree才是系统可用的内存,即:MemAvailable≈MemFree+Buffers+Cached,它是内核使用特定的算法计算出来的,是一个估计值。
2、使用free查询内存信息
adb shell free
free命令输出的total、free分别与/proc/meminfo中的MemTotal、MemFree对应。
参照free的输出结果,这里有几个计算公式:
为了直观说明,把第2行“Mem”称作OS Mem,把第三行 “buffers/cache”称作APP buffer/cache:
OS Mem total = OS Mem used + OS Mem free
APP buffers/cache used = OS Mem used - OS Mem buffers
APP buffers/cache free = OS Mem free + OS Mem buffers
APP buffers/cache total = APP buffers/cache used + APP buffers/cache free = OS Mem total
3、使用ActivityManager.MemoryInfo获取内存信息:
ActivityManager.MemoryInfo memInfo = new ActivityManager.MemoryInfo();
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
activityManager.getMemoryInfo(memInfo);
//系统内存的总大小
mTotalMemory = memInfo.totalMem;
//系统可用内存
mAvailMemory = memInfo.availMem;
//系统是否处于低内存运行
isLowMemory = memInfo.lowMemory
//当系统剩余内存低于memInfo.threshold时就是低内存运行,系统将开始kill后台服务和进程
mLowMemoryThresold = memInfo.threshold;
//app可使用的最大memory size,即getprop中的heapgrowthlimit
int mMaxMemory = activityManager.getMemoryClass();
//manifest中设置了largeHeap=true后,app可使用的最大memory size,即getprop中的heapsize
int mLargeMaxMemory = activityManager.getLargeMemoryClass()
查看App内存限制
Android app运行在vm上,而Android系统对vm heapsize做了一个硬性逻辑限制,就算物理内存富余,如果应用超出APP逻