c++ - 如何知道应用程序中可用的虚拟内存

标签 c++ c linux memory malloc

如题所示,

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

我要找的是某种函数

unsigned int free_mem();

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

最佳答案

由于您明确谈论可用的虚拟 内存,因此您需要找到当前未分配的虚拟地址空间部分。段信息在 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

在我目前正在测试的虚拟机上。

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

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

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

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

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

关于c++ - 如何知道应用程序中可用的虚拟内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28497840/

相关文章:

c++ - 在 C++ 中添加自定义字体并在 QML 中按其姓氏调用它们

c++ - 检查哪个模块最接近

c - 这不是只是返回原始大小吗?

python - 如何使用 Python 脚本退出 Linux 终端?

c++ - 在所有windows平台上都是4字节 float

c++ - 枚举器值的计算结果为 2147483648,无法将其缩小为类型 'int'

android - sadio register_driver() 会创 build 备名称吗?

c - C中if()条件内==(!=)运算符的LHS或RHS中的MACRO?

linux - 如何在没有行号或 ASCII 表的情况下仅打印来自 hexdump 的十六进制值?

linux - 如何通过 bash/shell 脚本计算文件组中特定单词的出现次数