【发布时间】:2015-03-12 19:24:28
【问题描述】:
似乎即使在我为malloc()分配的Linux进程释放了所有内存之后,
内存仍然为进程保留,不返回给操作系统。
默认运行valgrind massif 工具未发现任何泄漏。
运行 valgrind 和 --pages-as-heap=yes 揭示了这一点:
->13.77% (7,655,424B) 0x35FEEEB069: brk (brk.c:31)
->13.77% (7,655,424B) 0x35FEEEB113: sbrk (sbrk.c:53)
->13.77% (7,655,424B) 0x35FEE82717: __default_morecore (morecore.c:48)
->13.77% (7,655,424B) 0x35FEE7DCCB: _int_malloc (malloc.c:2455)
->13.77% (7,655,424B) 0x35FEE7F4F1: malloc (malloc.c:2862)
所以即使free() 已经释放了内存,malloc 似乎调用了brk/sbrk 并且没有将其返回给操作系统。
如何强制free() 立即调用sbrk() 并将所有内存返回给操作系统?
我在一个非常低端的平台上运行,每个 MB 都很重要。
提前致谢。
【问题讨论】:
-
malloc - 内存分配。它只是分配,它不会“释放”内存以供重复使用,这就是 free() 的原因。
-
嗯,似乎这可能是解决方案:stackoverflow.com/questions/2215259/…
-
这不是您的程序或
malloc/free调用的问题,而是将先前分配的内存页面映射到您的进程的操作系统。如果操作系统需要这些空闲页面,它会在需要时使用它们。我懒得找重复了,但是这个问题有很多重复。 -
@JoachimPileborg 实际上这显然不起作用。我从 Linux 内核崩溃说没有足够的内存。当我用 fork 调用我的进程并且它被杀死时,sbrk 被释放并且我能够继续。所以操作系统没有调用 sbrk 来释放之前释放的内存
标签: c linux memory memory-management glibc