环境:windows10 + visual studio.net 2019
硬件:4G内存
背景:之前的博客(https://blog.youkuaiyun.com/wingnet/article/details/99688035)提到了堆内存中内存碎片的问题,今天专门做个测试,看看是否如理论分析。
大容量对象和小容量对象轮流申请内存,然后释放所有小容量对象,按照之前的分析,应该无法再为大对象分配内存。
代码如下:
这段代码是 只给大对象分配内存,看看最多能创建多少个大对象。
#include <iostream>
#include <vector>
#include "ConsoleApplication1.h"
class TestBig {
int buf[1024*1024];
};
class TestSmall {
int buf[512*1024];
};
std::vector<TestBig*> vBig;
std::vector<TestSmall*> vSmall;
int main()
{
double dM = 1024.0 * 1024.0;
std::cout << "int size(byte) : " << sizeof(int) << "\n";
std::cout << "TestBig size(byte) : " << sizeof(TestBig) << " size(M) : "<< sizeof(TestBig) /dM <<"\n";
std::cout << "TestSmall size(byte) : " << sizeof(TestSmall) << " size(M) : " << sizeof(TestSmall) / dM << "\n";
for (long i = 0; i < 1024*1024; i++) {
try {
vBig.push_back(new TestBig());
}
catch(std::exception &ex){
std::cout << "--- " << ex.what() << " --- \n";
PrintSize();
break;
}
}
}
void PrintSize()
{
double dG = 1024.0 * 1024 * 1024.0;
std::cout << "big vector size : " << vBig.size()<< " size(G) : "<< 1.0*vBig.size()*sizeof(TestBig)/dG << "\n";
std::cout << "small vector size : " << vSmall.size() << " size(G) : " << 1.0*vSmall.size() * sizeof(TestSmall) / dG << "\n";
std::cout << "------\n";
}
下面的图片是x86的运行结果,可以看出,最多分配了1.93G:
下图是x64的运行结果,可以看出,最多分配了8.39G:
下面的代码进行了大对象和小对象轮换申请内存:
#include <iostream>
#include <vector>
#include "ConsoleApplication1.h"
class TestBig {
int buf[1024*1024];
};
class TestSmall {
int buf[512*1024];
};
std::vector<TestBig*> vBig;
std::vector<TestSmall*> vSmall;
int main()
{
double dM = 1024.0 * 1024.0;
std::cout << "int size(byte) : " << sizeof(int) << "\n";
std::cout << "TestBig size(byte) : " << sizeof(TestBig) << " size(M) : "<< sizeof(TestBig) /dM <<"\n";
std::cout << "TestSmall size(byte) : " << sizeof(TestSmall) << " size(M) : " << sizeof(TestSmall) / dM << "\n";
for (long i = 0; i < 1024*1024; i++) {
try {
vBig.push_back(new TestBig());
vSmall.push_back(new TestSmall());
}
catch(std::exception &ex){
std::cout << "--- " << ex.what() << " --- \n";
PrintSize();
break;
}
}
for (int i = 0; i < vSmall.size(); i++) {
delete vSmall[i];
}
vSmall.clear();
std::cout << "--- after delete vSmall vector : ---\n";
PrintSize();
for (int i = 0; i < 1024; i++) {
try {
vBig.push_back(new TestBig());
}
catch (std::exception ex) {
std::cout << "--- " << ex.what() << " --- \n";
PrintSize();
break;
}
}
}
void PrintSize()
{
double dG = 1024.0 * 1024 * 1024.0;
std::cout << "big vector size : " << vBig.size()<< " size(G) : "<< 1.0*vBig.size()*sizeof(TestBig)/dG << "\n";
std::cout << "small vector size : " << vSmall.size() << " size(G) : " << 1.0*vSmall.size() * sizeof(TestSmall) / dG << "\n";
std::cout << "------\n";
}
x86下的结果,确实如理论所预测,即使小对象的内存都被释放了,但是还是无法充分利用释放出来的空间创建大对象:
x64下的结果,似乎跟理论不太吻合,需要进一步分析: