【问题标题】:On Solaris continous memory allocation doesn't reduced image size在 Solaris 上连续内存分配不会减小映像大小
【发布时间】: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


【解决方案1】:

让我引用official oracle docs

请注意,执行 free() 后,释放的空间可供应用程序进一步分配,并且不会返回给系统。只有当应用程序终止时,内存才会返回给系统。

【讨论】:

  • 2048 * 9999 = 19mb。 OP 说他的程序使用了 80GB。
【解决方案2】:

我阅读了那篇文章,但正如您所见,我的分配模式几乎是不变的,我分配了大约 20MB 的内存,然后释放它,然后再次分配 20MB 的内存。

因此,如果 Solaris libc 正在重用释放的内存,那么它不应该一次又一次地调用 brk,并且进程大小应该保持不变,但在这里它会不断增长,似乎释放的内存永远不会被重用。

谢谢 尼拉吉拉蒂

【讨论】:

    猜你喜欢
    • 2020-08-05
    • 2020-12-27
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多