C - 想知道程序中的最大内存可分配大小

时间:2010-10-31 02:15:09

标签: c

我是C的新手

我想知道应用程序允许的最大内存。 所以我写了一个类似下面的小程序。

我的机器总内存为16GB,使用了2GB,14GB是免费的。 我预计这个程序会停止在14GB左右,但它会永远运行。

我想在这里做错吗?

#include <stdlib.h>
#include <stdio.h>

int main(){
    long total = 0;
    void* v = malloc(1024768);

    while(1) {
        total += 1024768;
        printf ( "Total Memory allocated : %5.1f GB\n", (float)total/(1024*1024768) );
        v = realloc(v, total);
        if (v == NULL) break;
    }
} 

编辑:在CentOS 5.4 64位上运行该程序。

3 个答案:

答案 0 :(得分:5)

在大多数现代操作系统中,为每个使用的页面分配内存,而不是为每个“保留”的页面分配内存。您的代码不使用任何页面,因此实际上没有分配内存。

尝试使用memset清除您分配的内存;最终程序会崩溃,因为它无法再分配页面。

我试图找到一个引用,但我没有成功。感谢您的帮助!

答案 1 :(得分:4)

  

我想在这里做错吗?

嗯,你说你运行应用程序的机器有16GB的RAM,所以我假设它是64位的。这意味着您的应用程序将在耗尽1 /物理内存和2 /虚拟内存之前运行很长时间。

在32位Windows上,您的应用程序将停止在4GB。在64位Windows上,您的应用程序将停止在16TB(假设您有一个可以自动增长的页面文件,以及那么多硬盘空间)。

http://support.microsoft.com/kb/294418

YMMV与其他操作系统。

编辑ruslik指出在实践中,您的进程无法在32位上分配最大2GB或3GB的内存(取决于编译二进制文件的方式)视窗。从上面链接的知识库文章中,您的进程占用的最大内存为3GB或4GB,1GB属于您无法使用的操作系统。

答案 2 :(得分:1)

如果您使用的是某个特定平台/操作系统,则应使用报告功能,这是该操作系统的特定功能。

如果你是eritiong跨平台程序,你不应该依赖任何免费的内存检查算法。原因是:

  1. 由于自身原因,操作系统可能会拒绝提供所有可用内存:碎片,分配限制等。
  2. 操作系统可能没有真正提供内存,只要分配空间,如果它有VMM。
  3. 算法可能会改变MM的内部状态,因此在调用check之前和之后可用的内存可能会有所不同。
  4. 由于OS并行运行多个进程,可用内存可能会因其他进程活动而自发更改。