5

我正在编写一个需要测量当前可用/已用 RAM 的 Android 应用程序。

搜索该站点显示了多个主题相似的主题,这些主题通常建议两种方法:


方法一:

MemoryInfo mi = new MemoryInfo();
ActivityManager activityManager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
activityManager.getMemoryInfo(mi);
long availableMegs = mi.availMem / 1048576L;
totalMegs = mi.totalMem / 1048576L;  //available since API 16 only

方法二:解析/proc/meminfo。

我已经尝试了这两种方法,它们似乎工作正常。我从两种方法中得到相同的值。我的问题是,当我转到Settings -> Apps -> Running屏幕底部时,会显示有关可用/已用 RAM 的信息,这与我通过上述方法获得的信息不同。我怀疑谷歌确实将缓存的应用程序报告为可用内存,因为当我杀死一些缓存的进程时,谷歌报告的 RAM 使用量几乎没有变化,但我的应用程序的数量接近我刚刚杀死的正在运行的进程的大小。

例子:

方法1输出:

meminfo: avail: 660, total: 821, used: 161

方法2输出:

root@android:/proc # cat meminfo
MemTotal:         840868 kB
MemFree:          548080 kB
Buffers:               0 kB
Cached:           128300 kB
SwapCached:            0 kB
Active:           192052 kB
Inactive:          79816 kB
Active(anon):     157792 kB
Inactive(anon):        0 kB
Active(file):      34260 kB
Inactive(file):    79816 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        143580 kB
Mapped:            67584 kB
Slab:               6736 kB
SReclaimable:       2104 kB
SUnreclaim:         4632 kB
PageTables:         4008 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      420432 kB
Committed_AS:    1606616 kB
VmallocTotal:     122880 kB
VmallocUsed:       20588 kB
VmallocChunk:      77828 kB

MemFree + Cached = 660MB


Android reported RAM usage: 679MB Free, 142MB used.

如何获得与 Android 报告相同的数字?

我认为我必须从中获取它,/proc/meminfo因为官方 API 似乎不存在。

4

2 回答 2

5

MemTotal — 物理 RAM 的总量,以千字节为单位。

MemFree — 系统未使用的物理 RAM 量,以千字节为单位。

缓冲区 — 用于文件缓冲区的物理 RAM 量(以千字节为单位)。

Cached — 用作高速缓存的物理 RAM 量(以千字节为单位)。

SwapCached — 用作高速缓存的交换量(以千字节为单位)。

活动 — 处于活动使用状态的缓冲区或页面高速缓存内存总量(以千字节为单位)。这是最近使用过的内存,通常不会为其他目的而回收。

非活动 - 空闲和可用的缓冲区或页面高速缓存内存总量(以千字节为单位)。这是最近未使用的内存,可以回收用于其他目的。

HighTotal 和 HighFree — 未直接映射到内核空间的内存总量和可用内存量(以千字节为单位)。HighTotal 值可能因使用的内核类型而异。

LowTotal 和 LowFree — 直接映射到内核空间的内存总量和可用内存量(以千字节为单位)。LowTotal 值可能因使用的内核类型而异。

SwapTotal — 可用的交换总量,以千字节为单位。

SwapFree — 可用交换的总量,以千字节为单位。

Dirty — 等待写回磁盘的内存总量,以千字节为单位。写回 — 主动写回磁盘的内存总量,以千字节为单位。

已映射 — 已用于使用 mmap 命令映射设备、文件或库的内存总量(以千字节为单位)。

Slab — 内核用于缓存数据结构以供自己使用的内存总量,以千字节为单位。

Committed_AS — 估计完成工作负载的内存总量(以千字节为单位)。该值代表最坏情况下的值,还包括交换内存。PageTables — 专用于最低页表级别的内存总量,以千字节为单位。

VMallocTotal — 总分配的虚拟地址空间的内存总量,以千字节为单位。

VMallocUsed — 已用虚拟地址空间的内存总量,以千字节为单位。

VMallocChunk — 可用虚拟地址空间的最大连续内存块,以千字节为单位。

HugePages_Total — 系统的大页面总数。该数字是通过将 Hugepagesize 除以为 /proc/sys/vm/hugetlb_pool 中指定的巨页预留的兆字节数得出的。此统计信息仅出现在 x86、Itanium 和 AMD64 架构上。

HugePages_Free — 系统可用的大页面总数。此统计信息仅出现在 x86、Itanium 和 AMD64 架构上。

Hugepagesize — 每个大页面单位的大小,以千字节为单位。默认情况下,在 32 位架构的单处理器内核上,该值为 4096 KB。对于 SMP、hugemem 内核和 AMD64,默认值为 2048 KB。对于 Itanium 体系结构,默认值为 262144 KB。此统计信息仅出现在 x86、Itanium 和 AMD64 架构上。

于 2015-05-07T08:33:16.927 回答
0

,Settings -> Apps -> Running在高级有两个分区:usedfree.

然而,当你仔细观察时,Running唯一的 contains 占据了 ; 的一部分used

同样,当您单击按钮show cached processes(在左上角)时,您会看到(在底部)它们只占据了free; 另一部分应该是真正的空闲内存(即没有任何缓存的应​​用程序)。

问题是它没有显示任何数字。而且从真正的空闲内存的“部分”来看,它似乎与你得到的还有一点不同proc/meminfo

于 2014-04-04T13:51:55.853 回答