我在Solaris sparc服务器上编写了一个测试程序,并使用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 现在,当我运行它时,我可以看到,当进程达到系统内存限制时,进程大小不断增加,进程崩溃。我使用桁架跟踪它,我只能看到brk系统调用。在搜索一些甲骨文站点时,我设置了LD_PRELOAD=libmapmalloc.so,然后进程大小是恒定的。truss显示,这一次它使用malloc映射匿名内存页。
另一方面,我也试图在RHELLinux2.6 x86盒上看到这种行为,它也使用了桁架,但是进程大小是恒定的。
我不理解行为或Solaris,在第一种情况下,它使用brk来增加数据段的大小,但是当我删除时,它并没有减少它。有人能解释一下solaris为什么这样做吗?
因此,linux在这里所做的不同之处在于保持进程大小不变,因为它也使用相同的系统调用。
谢谢Niraj Rathi
发布于 2013-08-08 20:22:00
我读了那篇文章,但正如您所看到的那样,我的分配模式几乎是恒定的,我正在分配大约20 my的内存,然后释放它,然后再分配20 my的内存。
因此,如果Solaris libc重用释放的内存,那么它不应该一次又一次地调用brk,进程大小应该保持不变,但是在这里,它是持续增长的,似乎释放的内存从未被重用过。
谢谢Niraj Rathi
发布于 2013-08-08 19:45:42
让我引用官方甲骨文的话:
注意,在执行free()之后,释放的空间可供应用程序进一步分配,而不返回给系统。只有当应用程序终止时,内存才返回给系统。
https://stackoverflow.com/questions/18134405
复制相似问题