理论教育 使用ActivityManager.getMemoryInfo()获取内存信息

使用ActivityManager.getMemoryInfo()获取内存信息

时间:2023-06-19 理论教育 版权反馈
【摘要】:例如下面的演示代码:函数activityManager.getMemoryInfo()是用ActivityManager.MemoryInfo返回结果,而不是Debug.MemoryInfo。

使用ActivityManager.getMemoryInfo()获取内存信息

除了本节前面介绍的四种方法外,接下来还介绍几种其他查看内存的方法。

1.Running Services方式

我们可以通过手机上Running Services的Activity查看内存,依次单击“Setting”→“Applica- tions”→“Running Services”来实现。

2.getMemoryInfo方式

使用ActivityManager的getMemoryInfo(ActivityManager.MemoryInfo outInfo)函数,可以得到当前系统剩余内存,以判断是否处于低内存运行。例如下面的演示代码:

函数activityManager.getMemoryInfo()是用ActivityManager.MemoryInfo返回结果,而不是Debug.MemoryInfo。

ActivityManager.MemoryInfo只有如下三个字段:

(1)availMem:表示系统剩余内存;

(2)lowMemory:是boolean值,表示系统是否处于低内存运行;

(3)hreshold:它表示当系统剩余内存低于好多时就看成低内存运行。

3.getMemoryInfo或Activity Manager方式

在代码中可以使用Debug中的getMemoryInfo(Debug.MemoryInfo memoryInfo)函数或Activity Manager的MemoryInfo[]getProcessMemoryInfo(int[]pids)函数,这样能够得到比较详细地展现MemoryInfo所描述的内存使用情况,数据单位是KB。Android和Linux一样有大量内存在进程之间共享。某个进程具体使用多少内存实际是很难统计的。

因为有Paging out to Disk(换页)的存在,所以如果把所有映射到进程的内存相加,它可能大于内存的实际物理大小。此方法MemoryInfo的Field说明如下:

dalvik:是指dalvik(虚拟机)所使用的内存。

native:是被Native(本地)堆使用的内存,应该指使用C\C++在堆上分配的内存。

other:是指除dalvik和native使用的内存。至少包括在C\C++分配的非堆内存,比如分配在栈上的内存。

private:是指私有的,非共享的。

share:是指共享的内存。

PSS:实际使用的物理内存(比例分配共享库占用的内存)。

Pss:它是把共享内存根据一定比例分摊到共享它的各个进程来计算所得到进程使用内存。网上又说是比例分配共享库占用的内存,那么至于这里的共享是否只是库的共享,还是不清楚。

PrivateDirty:它是指非共享的,又不能换页出去的内存的大小。比如Linux为了提高分配内存速度而缓冲的小对象,即使进程结束,该内存也不会释放掉,它只是又重新回到缓冲中而已。

SharedDirty:是指共享的,又不能换页出去的内存的大小。比如Linux为了提高分配内存速度而缓冲的小对象,即使所有共享它的进程结束,该内存也不会释放掉,它只是又重新回到缓冲中而已。(www.daowen.com)

MemoryInfo所描述的内存使用情况都可以通过命令“adb shell"dumpsys meminfo%cur ProcessName%"”得到。如果想在代码中同时得到多个进程的内存使用或非本进程的内存使用情况请使用ActivityManager的MemoryInfo[]getProcessMemoryInfo(int[]pids),或者Debug的getMemoryInfo(Debug.MemoryInfo memoryInfo)。

我们可以通过ActivityManager的List<ActivityManager.RunningAppProcessInfo>get RunningAppProcesses()得到当前所有运行的进程信息。ActivityManager.RunningAppProcessInfo中就有进程的id,名字以及该进程包括的所有apk包名的列表等。

4.使用Debug的方法

这里的Debug的方法是指getNativeHeapSize()、getNativeHeapAllocatedSize()、getNative HeapFreeSize()三个方法。该方式只能得到native堆的内存大概情况,数据单位为字节。

static long getNativeHeapAllocatedSize():返回的是当前进程navtive堆中已使用的内存大小。

static long getNativeHeapFreeSize():返回的是当前进程navtive堆中已经剩余的内存大小。

static long getNativeHeapSize():返回的是当前进程navtive堆总的内存大小。

例如下面的演示代码:

5.使用dumpsys meminfo命令

可以在adb shell中运行dumpsys meminfo命令来得到进程的内存信息,在该命令的后面需要加上进程的名字,以确定是哪个进程。比如命令“adb shell dumpsys meminfo com.teleca.robin.test”会得到com.teleca.robin.test进程使用的内存的信息,如下:

在上述信息中,“size”表示的是总内存大小,“allocated”表示的是已使用了的内存大小,“free”表示的是剩余的内存大小。

6.使用“adb shell procrank命令

查看所有进程的内存使用情况,可以使用“adb shell procrank”命令。此命令会返回将如下信息:

其实这里的Pss和方式5中Pss的total并不一致,这是因为procrank命令和meminfo命令使用的内核机制不太一样,所以结果会有细微差别。

7.使用“adb shell cat/proc/meminfo命令

该方式只能得出系统整个内存的大概使用情况,例如下面的格式:

上述格式中的具体说明如下。

MemTotal:可供系统和用户使用的总内存大小,它比实际的物理内存要小,因为还有些内存要用于radio、DMA buffers等。

MemFree:剩余的可用内存大小。这里该值比较大,实际上一般Android系统的该值通常都很小,因为系统总是尽量让进程都保持运行,所以会耗掉大量的内存。

Cached:是系统用于文件缓冲等的内存,通常系统需要20MB大小以避免寻呼状态不好。当内存紧张时,Android的Memory Killer会杀死一些后台进程,以避免他们消耗过多的缓存

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈