malloc可以分配的最大内存

我试图弄清楚我的机器(1GB内存160GB高清Windows平台)可以最大限度地使用malloc。

我读了malloc可以分配的最大内存限于物理内存(在堆上)。

另外,当一个程序超过内存消耗到一定程度,计算机停止工作,因为其他应用程序没有得到足够的内存,他们需要。

所以要确认一下,我用C写了一个小程序:

int main(){ int *p; while(1){ p=(int *)malloc(4); if(!p)break; } } 

我希望有一段时间,内存分配将失败,循环会中断,但我的电脑挂起,因为它是一个无限循环。

我等了大约一个小时,最后我不得不强行closures我的电脑。

一些问题:

  • malloc是否也从HD分配内存?
  • 上述行为的原因是什么?
  • 为什么在任何时候都没有循环rest?
  • 为什么没有分配失败?

我读了malloc可以分配的最大内存限于物理内存(在堆上)。

错误:大多数计算机/操作系统支持虚拟内存,由磁盘空间支持。

一些问题: malloc也从硬盘分配内存?

malloc要求的操作系统,这反过来可能会使用一些磁盘空间。

上述行为的原因是什么? 为什么循环不休?

为什么没有分配失败?

你一次只要求太less:循环最终会打破(在你的机器慢慢爬行之后,由于虚拟与物理内存的大量过剩以及随之而来的超频磁盘访问,这个问题被称为“颠簸” “),但在此之前它已经耗尽了你的耐心。 尝试获得例如一次一兆字节。

当一个程序超过内存消耗到一定的水平,计算机停止工作,因为其他应用程序没有得到足够的内存,他们需要。

完全停止是不太可能的,但是当通常需要几微秒的操作结束时(例如)几十毫秒时,这四个数量级当然可以使得感觉就像计算机已经基本停止了,以及通常一分钟可能需要一个星期。

我知道这个线程是旧的,但是对于任何愿意自己尝试的人来说,都可以使用这个代码

 #include <stdlib.h> int main() { int *p; while(1) { int inc=1024*1024*sizeof(char); p=(int*) calloc(1,inc); if(!p) break; } } 

 $ gcc memtest.c $ ./a.out 

在运行时,这段代码填充了一个RAM,直到内核被杀死。 使用calloc而不是malloc来防止“懒惰评估”。 从这个线程采取的想法: Malloc内存问题

这段代码很快填满了我的RAM(4Gb),然后在大约2分钟内我的20Gb交换分区才死了。 64位Linux当然。

malloc做自己的内存pipe理,自己pipe理小内存块,但最终它使用Win32 堆函数来分配内存。 你可以把malloc想象成一个“内存分销商”。

Windows内存子系统包括物理内存(RAM)和虚拟内存(HD)。 当物理内存稀less时,可以将某些页面从物理内存复制到硬盘上的虚拟内存中。 Windows透明地做到这一点。

默认情况下,虚拟内存已启用,并将占用HD上的可用空间。 因此,您的testing将继续运行,直到它为进程分配了全部的虚拟内存量(32位窗口上的2GB)或填充硬盘。

尝试这个

 main() { int Mb = 0; while ( malloc(1<<20)) ++Mb; printf("Allocated %d Mb total\n", Mb); } 

包含stdlib和stdio。
这种提取物来自深层的秘密

我实际上并不知道为什么失败,但有一点需要注意的是`malloc(4)“实际上可能不会给你4个字节,所以这种技术并不是一个真正准确的方法来查找你的最大堆大小。

我在这里发现了这个问题。

例如,当你声明4个字节的内存时,你的内存之前的空间可能包含整数4,作为内核指示你请求了多less内存。

按照C90标准,可以保证至less可以获得一个大小为32 KB的对象,这可能是静态,dynamic或自动内存。 C99保证至less64千字节。 对于任何更高的限制,请参阅您的编译器的文档。

此外,malloc的参数是一个size_t,该types的范围是[0,SIZE_MAX],所以您可以请求的最大值是SIZE_MAX,该值根据实现而不同,并在<limits.h>定义。

当你第一次为* p分配任何大小的时候,每当你下一次把这个内存放到未被引用的地方。 这意味着

您的程序一次只能分配4个字节的内存

。 那么你怎么能使用整个RAM,这就是为什么SWAP设备(HDD上的临时空间)没有讨论的原因。 我知道一个内存pipe理algorithm,当没有一个程序引用内存块时,该块有资格为程序内存请求分配。 这就是为什么你只是忙于RAM Driver ,这就是为什么它不能给服务其他程序的机会。 这也是一个悬而未决的参考问题。

答:您最多可以分配您的RAM大小的内存。 因为没有程序可以访问交换设备。

我希望你所有的问题都能得到满意的答复。