malloc可以分配的最大内存
我试图弄清楚我的机器上最多可以使用多少内存(1 Gb RAM 160 Gb HD Windows平台)。
我读了malloc可以分配的最大内存限于物理内存(在堆上)。
另外,当某个程序将内存消耗量超过一定水平时,计算机将停止工作,因为其他应用程序没有获得足够的内存。
为了确认,我用C写了一个小程序:
int main(){
int *p;
while(1){
p=(int *)malloc(4);
if(!p)break;
}
}
我希望有一段时间内存分配会失败,并且循环会中断,但是我的电脑挂起,因为它是一个无限循环。
我等了大约一个小时,最后我不得不强制关闭我的电脑。
一些问题:
我读了malloc
可以分配的最大内存限于物理内存(在堆上)。
错误:大多数计算机/操作系统支持虚拟内存,由磁盘空间支持。
一些问题: malloc
也从HDD分配内存?
malloc
询问操作系统,这反过来可能会使用一些磁盘空间。
上述行为的原因是什么? 为什么循环不会随时断开?
为什么没有分配失败?
您一次只要求太少:最终会导致循环崩溃(在您的计算机由于虚拟与物理内存的大量过剩以及随之而来的超频磁盘访问而导致缓慢爬行之后),这个问题称为“抖动“),但在此之前它已经耗尽了你的耐心。 尝试一次获得例如一兆字节。
当程序超过内存使用量达到一定程度时,计算机停止工作,因为其他应用程序没有获得足够的内存。
一个完全停止是不太可能的,但是当通常需要几微秒的操作最终需要(例如)几十毫秒时,这四个数量级当然可以使得它感觉好像计算机已经基本停止,并且通常会采取什么一分钟可能需要一个星期。
我知道这个线程是旧的,但对于任何愿意自己尝试的人来说,都可以使用此代码进行剪切
#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交换分区在它死亡之前。 当然是64bit的Linux。
malloc
做自己的内存管理,管理小内存块本身,但最终它使用Win32堆函数来分配内存。 您可以将malloc
视为“内存分销商”。
Windows内存子系统包括物理内存(RAM)和虚拟内存(HD)。 当物理内存变得稀少时,可以将某些页面从物理内存复制到硬盘上的虚拟内存中。 Windows透明地执行此操作。
默认情况下,启用虚拟内存并消耗HD上的可用空间。 因此,您的测试将继续运行,直到它为该进程分配了全部数量的虚拟内存(32位Windows上为2GB)或填充硬盘。
链接地址: http://www.djcxy.com/p/15171.html