【发布时间】:2013-08-08 19:25:20
【问题描述】:
我在 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 在这里做些什么来保持进程大小不变,因为它也使用相同的系统调用。
谢谢 尼拉吉拉蒂
【问题讨论】:
-
在完成所有这些指针的分配之前它会崩溃吗?
-
内存大小超过 80GB 后崩溃。系统只有 85GB 内存。
-
在到达第二个 for 循环之前会崩溃吗?
标签: c++ linux memory-management solaris-10