我在Solaris sparc服务器上编写了一个测试程序,并使用Sun Studio
对其进行了编译#include <iostream>
using namespace std;
int main()
{
const int size = 9999;
char *ptr[size];
while(1)
{
for(int i = 0; i < size; i++)
{
ptr[i] = new char[2048];
}
for(int i = 0; i < size; i++)
{
delete[] ptr[i];
}
}
return 9;
}
compiled it as
CC -m64 -g
现在,当我运行它时,我可以看到进程大小不断增加,并且当它达到系统内存限制时进程崩溃。我使用truss跟踪它,我只能看到brk系统调用。 在搜索一些oracle站点时,我设置了LD_PRELOAD = libmapmalloc.so,然后进程大小是不变的。 truss表明这次是使用malloc来映射匿名内存页面。
另一方面,我试图在RHEL Linux 2.6 x86盒子上看到这个行为,并且它也使用了truss但是进程大小是恒定的。
我不理解行为或Solaris在第一种情况下使用brk来增加数据段的大小但是当我执行删除时它没有减少它。有人可以解释一下为什么solaris会这样做吗?
所以Linux在这里做的不同是为了保持流程大小不变,因为它也使用相同的系统调用。
由于 Niraj Rathi
答案 0 :(得分:0)
让我引用official oracle docs:
请注意,执行free()后,释放的空间可供应用程序进一步分配,不返回系统。仅当应用程序终止时,内存才会返回到系统。
答案 1 :(得分:0)
我读过那篇文章但是你可以看到我的分配模式几乎是不变的我分配大约20MB的内存然后释放它然后再分配20MB的内存。
因此,如果Solaris libc正在重用已释放的内存,那么它不应该一次又一次地调用brk,并且进程大小应该保持不变,但是这里它会不断增长,并且似乎释放的内存永远不会被重用。
由于 Niraj Rathi