如何耗尽内存
how to exhaust memory?
这可能看起来很傻,但我现在有点困惑。为什么这个程序不会消耗所有的内存?例如:我在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*),尽管在许多系统中是正确的。
关于内存使用有一些误解。
-
2GB内存的机器并不意味着你只能使用2GB内存。(1)我们有交换空间;(2) Linux超时提交
-
new int
不占用4字节。有内存开销 -
不能使用所有内存。内存碎片,文本段等。
- 将字符串存储在c++中的稳定内存中
- 在C++中释放内存期间,迭代器与指针有何不同
- 堆上的内存如何耗尽?
- 无论代码长度如何,以下代码的内存要求有何不同?
- AWS pandas 安装出现错误:虚拟内存已耗尽:无法分配内存
- C++ 友元函数在内存位置上有何不同?
- 在 cplex c++ 音乐会 api++ 中处理非常大的问题而不会耗尽内存
- CC1PLUS:虚拟内存耗尽
- "acquire" 和"consume"内存顺序有何不同,何时"consume"可取?
- 我想在应用程序因内存耗尽而崩溃时显示消息框
- 在没有 new 关键字的情况下初始化C++对象的内存从何而来
- 为什么我可以通过重复分配和解分配内存来耗尽系统的所有内存?
- C++中内存泄漏本身存在多长时间,以及等效的Java程序有何不同
- 内存耗尽会导致分段故障吗?
- 当应用程序开始耗尽内存时该怎么办?
- 使用clang++编译程序,但g++会耗尽内存并失败
- 虚拟内存耗尽:无法分配内存
- 如何耗尽内存
- 编译错误:虚拟内存耗尽
- 初始化数组与错置内存有何不同?