如何知道应用程序内的可用虚拟内存

时间:2015-02-13 10:47:56

标签: c++ c linux memory malloc

正如标题所示,

是否可以知道当前可用的虚拟内存     (可由malloc / mmap分配)在应用程序中     编程?

我正在寻找的是某种功能

unsigned int free_mem();

将返回malloc或mmap可分配的内存大小。

1 个答案:

答案 0 :(得分:1)

由于您明确谈论可用的虚拟内存,因此您需要找到当前未分配的虚拟地址空间部分。细分信息位于proc/self/smaps

但是,虚拟地址空间的大小由程序执行的cpu决定。这是64位处理器上的 64位,但可由cat /proc/cpuinfo | grep "address sizes"确定,产生

address sizes   : 42 bits physical, 48 bits virtual
address sizes   : 42 bits physical, 48 bits virtual
address sizes   : 42 bits physical, 48 bits virtual
address sizes   : 42 bits physical, 48 bits virtual
address sizes   : 42 bits physical, 48 bits virtual
address sizes   : 42 bits physical, 48 bits virtual
address sizes   : 42 bits physical, 48 bits virtual
address sizes   : 42 bits physical, 48 bits virtual
我正在测试它的VM上的

请注意,可用虚拟地址空间的总量与一次性可分配的最大数量不同,因为您只能映射连续数量的内存。

例如,考虑具有以下段的32位指针的简单情况:

00020000-000204ff /usr/bin/executable
00030000-0003ffff [heap]
7ff80000-7ff9ffff [stack]

在这种情况下,最大连续段为7ffA000-ffffffff,但可用虚拟内存总量仅略低于4 GB。

另请注意,malloc可以通过重用已经请求的页面来满足您的请求,而无需更多虚拟内存。以这种方式可用的数量取决于许多事情(分配或分配的大小,堆的状态),并且不能以任何可移植的方式查询。如果有人LD_PRELOADs another malloc implementation,则保持加倍。