堆通常与架构上可寻址的虚拟内存一样大。
您应该使用ulimit -a 命令检查您的系统当前限制并查找此行 max memory size (kbytes, -m) 3008828,在我的 OpenSuse 11.4 x86_64 上使用 ~3.5 GiB 内存的这行表示我每个进程大约有 3GB 内存。
然后您可以使用这个简单的程序来真正测试您的系统,以检查每个进程的最大可用内存:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char* argv[]){
size_t oneHundredMiB=100*1048576;
size_t maxMemMiB=0;
void *memPointer = NULL;
do{
if(memPointer != NULL){
printf("Max Tested Memory = %zi\n",maxMemMiB);
memset(memPointer,0,maxMemMiB);
free(memPointer);
}
maxMemMiB+=oneHundredMiB;
memPointer=malloc(maxMemMiB);
}while(memPointer != NULL);
printf("Max Usable Memory aprox = %zi\n",maxMemMiB-oneHundredMiB);
return 0;
}
此程序以 100MiB 为增量获取内存,显示当前分配的内存,在其上分配 0,然后释放内存。当系统无法提供更多内存时,返回 NULL 并显示最终的最大可用内存量。
需要注意的是,您的系统将在最后阶段开始大量交换内存。根据您的系统配置,内核可能会决定终止某些进程。我使用 100 MiB 的增量,因此某些应用程序和系统有一些喘息的空间。你应该关闭任何你不想崩溃的东西。
话虽如此。在我写这篇文章的系统中,没有任何崩溃。上面的程序报告几乎与ulimit -a 相同。不同的是,它实际测试了内存,并通过memset() 确认内存已被给予和使用。
对于 Ubuntu 10.04x86 VM 与 256 MiB 内存和 400MiB 交换空间的比较,ulimit 报告为memory size (kbytes, -m) unlimited,而我的小程序报告了 524.288.000 字节,这大致是 ram 和 swap 的组合,折扣 ram 使用其他软件和内核。
编辑:正如 Adam Zalcman 所写,ulimit -m 在较新的 2.6 及更高版本的 linux 内核上不再受到尊重,所以我坚持纠正。但是ulimit -v 很荣幸。对于实际结果,您应该将 -m 替换为 -v,并查找 virtual memory (kbytes, -v) 4515440。我的 suse 盒子的 -m 值与我的小实用程序报告的值似乎只是偶然的。请记住,这是内核分配的虚拟内存,如果物理内存不足,则需要交换空间来弥补。
如果你想知道有多少物理内存可用而不干扰任何进程或系统,你可以使用
long total_available_ram =sysconf(_SC_AVPHYS_PAGES) * sysconf(_SC_PAGESIZE) ;
这将排除缓存和缓冲内存,因此这个数字可能远小于实际可用内存。操作系统缓存可以非常大,并且它们的逐出可以提供所需的额外内存,但这由内核处理。