如何耗尽内存

how to exhaust memory?

本文关键字:内存 何耗尽      更新时间:2023-10-16

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

  #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 ram,它只能容纳2^30/2^2=2^28

2)按照上面的逻辑,你怎么能改变程序实际上消耗所有的2GB内存?

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

谢谢!

由于虚拟寻址,您可以分配比实际拥有的内存更多的内存。操作系统会自动分页出你不使用的内存(到硬盘驱动器)。通过这种方式,您的RAM充当了硬盘交换文件的大缓存,它代表了系统的实际内存。

您的实际限制是指针的地址空间,除非您为64位平台编译(并在其上运行),否则它是32位的。所以你可以分配4GB的空间

你的计算似乎很可疑。

220 = 1,048,576
211 = 2048

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

还要记住,您的机器可能有超过您安装的2 GB物理RAM的虚拟内存。

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

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

2gb等于20亿个字节。这意味着您的RAM可以容纳大约5亿个int指针。现在,您的系统还有一个用于存储的交换文件,它可能和您的RAM一样大,甚至更大。

2 ^ 20大约是一百万。所以当你的程序占用你的一些内存时,它不会把它们全部用完。只需将pow()调用增加到一个大得离谱的数字,它就可以工作了。玩得开心!

还有:不能保证sizeof(int) == sizeof(int*),尽管在许多系统中是正确的。

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

  1. 2GB内存的机器并不意味着你只能使用2GB内存。(1)我们有交换空间;(2) Linux超时提交

  2. new int不占用4字节。有内存开销

  3. 不能使用所有内存。内存碎片,文本段等。