如何耗尽内存?

4

可能看起来有些傻,但我现在有点困惑。为什么这个程序不会消耗所有的内存呢? 例如:我在Linux终端上运行以下程序(内存为2G):

  #include <iostream>
  #include <cmath>
  using namespace std;

  int main()
  {
     cout<<sizeof(int*)<<endl;
     for(int i=0; i<pow(2.0,30.0);i++)
       {
         new int(i);
       }
    return 1;
  }

1) 我确认了这台机器的int大小为4个字节,那么对于2GB内存,它只能容纳2^30/2^2=2^28。

2) 按照上述逻辑,你如何更改程序以实际使用全部2GB内存?

补充:我只是想确保我理论上理解得正确。如果没有虚拟内存或操作系统优化等等,2GB RAM只能容纳2^28个int,对吗?在这种情况下,上面的程序将消耗所有内存?你知道如何在Linux中关闭虚拟内存/交换内存等功能吗?

谢谢!


1
你真正想要做什么呢?如果您想测试代码在低内存情况下的工作情况,那么您应该编译新版本的new/delete,以便在测试期间适当的时间抛出异常。 - Martin York
5个回答

7
由于虚拟寻址技术,您可以分配比实际RAM更多的内存。操作系统将自动将您未使用的内存(到硬盘)换出。这样,您的RAM就像硬盘交换文件的大缓存,代表了您系统的实际内存。
您的实际限制是指针的地址空间,除非您编译并在64位平台上运行,否则为32位。因此,您可以分配4GB的空间。

64位机器现在相对普遍。那么理论上它可以消耗多少内存? - Martin York
现在大多数Linux发行版不是默认启用PAE吗? - Martin Beckett
今天的x86-64实现(CPU)只允许指针使用48位(即使它们的大小为64位;另外的24位目前被浪费了)。因此,这是2^48,或256 TB。这足够用一段时间了。 - Nicol Bolas
@Martin Beckett:PAE 只影响操作系统可以访问的内容;32 位应用程序仍然受限于 32 位虚拟地址空间。操作系统可以访问 36 位,这使得 32 位操作系统可以使用 64GB 的实际 RAM。 - Nicol Bolas

4

你的计算似乎存在问题。

220 = 1,048,576
211 = 2,048

为了分配十亿个整数,可以尝试使用 230。请注意,你的 vector<int*> 将占用大量空间(至少和你分配的整数一样多)。如果只是想简单地耗尽内存,根本不需要它。你可以调用 new int(i) 并丢弃返回的指针,内存仍然会被分配。

另外,请记住你的机器可能有超过安装的 2 GB 物理 RAM 的虚拟内存。


可以肯定,2^30等等都能够运行。我想知道基于机器的RAM大小的确切数字,这可能吗? - WilliamLou
你改变了问题,这使得我的回答有些不太有用。然而,你似乎仍然认为2 GB = 2^11,这显然是错误的,相差几个数量级。 - Greg Hewgill

1

你的程序在使用内存时没有做任何有用的事情。因此优化器可以将其优化为:

  #include <iostream>

  int main()
  {
     std::cout<<sizeof(int*)<<endl;
     for(int i=0; i<(1<<10);i++)
       {
         // nothing
       }
    return 1;
  }

0

2GB 相当于两亿字节。这意味着你的 RAM 可以容纳大约五亿个 int 指针。现在,你的系统还有一个交换文件用于存储,它可能与你的 RAM 一样大或更大。

2 ^ 20 约为一百万。因此,虽然你的程序会占用一些内存,但并不会全部使用。只需将 pow() 调用增加到极大的数字,它就能正常运行。祝玩得开心!

另外:没有保证 sizeof(int) == sizeof(int*),尽管对于许多系统来说是正确的。


0

有一些有关于内存使用的误解。

  1. 2GB内存机器并不意味着你只能使用2GB内存。 (1)我们有交换空间 ; (2)Linux会进行过度承诺。

  2. new int并不只占用4个字节。 这里有内存开销。

  3. 你不能使用全部内存。 内存碎片化、.text节等等都会占用内存空间。


关于第一点:单个进程只能使用2GB。交换空间仅在考虑(a)多个进程或(b)内存小于(2GB +操作系统开销)的机器时才相关。 - RobH
@RobH,在x86上,Linux多年来一直有3:1(用户模式下3GB虚拟空间,内核模式下1GB虚拟空间)。当然,在64位机器上可以拥有更多。而单个处理器并不意味着您可以使用所有内存(+操作系统开销),因为一些内存可能被其他进程“mlock”住。 - J-16 SDiZ
我误读了问题,以为机器有2:2的分裂。哎呀! - RobH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接