使用free()时,内存使用量不会减少[重复]

问题描述 投票:8回答:3

这个问题在这里已有答案:

我正在编写独立于操作系统的无锁队列,到目前为止它工作得很好,但内存管理存在小问题。我不确定它的gcc问题还是我的问题。问题:当元素添加到列表时,内存增加,但是当从列表中删除元素时(free(elementPointer);)内存使用不会改变。

但是当我使用pthreads时,N个生产者和M个消费者(1<N<20, 1<M<20)的内存使用量总是大约10mb(当试图添加和删除~10kk元素时),所以看起来像免费工作。

而有趣的是,在VS 2010(相同的代码,没有线程)免费工作正常,内存被释放(观看任务管理器)。

我做了测试,添加1kk元素,添加全部后,逐个删除所有元素(无线程)。

Linux - 0.08秒

Windows~57秒

Linux(不含免费) - 0.07秒

Windows(不含免费) - 0.9秒

所以,问题是,为什么在没有使用线程的情况下,Linux C中没有释放内存?如有必要,我可以发布代码。

GCC版本:4.4.3

c linux multithreading pthreads
3个回答
10
投票

在许多操作系统上,free()不再为操作系统提供内存,而是“仅”用于malloc()的新调用。这就是为什么你没有看到内存使用量在外部下降的原因,但是当你通过线程增加新的分配数量时,内存会被重新使用,所以总使用量不会通过。


8
投票

Malloc不必将内存返回给操作系统。类Unix系统上的大多数malloc实现都没有这样做。特别是对于较小的物体尺寸

这是出于性能原因而完成的。

我只是注意到这可能不清楚。 “malloc”我指的是与malloc函数相关的整个子系统 - malloc,free,realloc,calloc以及libc可能实现的任何特殊函数。


5
投票

为了简化过程,在动态内存分配中有两个内存管理器:OS内存管理器和进程内存管理器(可以有多个内存管理器)。 OS内存管理器为各个进程内存管理器分配“大块”内存。每个进程内存管理器都会跟踪分配的段以及“自由段”。进程内存管理器不会将自由段返回到操作系统内存管理器,因为如果需要稍后分配更多内存,则保持它更有效。

© www.soinside.com 2019 - 2024. All rights reserved.