正如标题所示,
是否可以知道当前可用的虚拟内存 (可由malloc / mmap分配)在应用程序中 编程?
我正在寻找的是某种功能
unsigned int free_mem();
将返回malloc或mmap可分配的内存大小。
答案 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_PRELOAD
s another malloc
implementation,则保持加倍。