使用 free() 时内存使用量不会减少[重复]
- 2024-11-11 08:26:00
- admin 原创
- 21
问题描述:
我正在编写独立于操作系统的无锁队列,到目前为止,它运行良好,但内存管理存在一个小问题。我不确定是 gcc 的问题还是我的问题。问题:将元素添加到列表时内存会增加,但从列表中删除元素时(free(elementPointer);)内存使用量不会改变。
但是当我使用 pthreads 时,N 个生产者和 M 个消费者的 (1<N<20, 1<M<20)
内存使用量始终约为 ~10mb(当尝试添加和删除 ~10kk 个元素时),因此看起来 free 正在起作用。
有趣的是,在 VS 2010(相同代码,无线程)中,free 工作正常,内存被释放(观察任务管理器)。
我做了测试,添加了 1kk 个元素,添加完所有元素后,逐个删除所有元素(没有线程)。
Linux-0.08 秒
Windows〜57秒
Linux(不含免费) - 0.07 秒
Windows(无免费)-0.9秒
那么,问题是,当不使用线程时,为什么 Linux C 中不释放内存?如有必要,我可以发布代码。
GCC 版本:4.4.3
解决方案 1:
在许多操作系统上,free()
不会再次将内存提供给操作系统,而“仅”用于对 的新调用malloc()
。这就是为什么您看不到内存使用量从外部下降的原因,但是当您通过线程增加新分配的数量时,内存会被重新使用,因此总使用量不会急剧上升。
解决方案 2:
Malloc 不必将内存返回给操作系统。类 Unix 系统上的大多数 malloc 实现都不这样做。特别是对于较小的对象大小。
这样做是出于性能方面的考虑。
我刚刚注意到这可能不太清楚。我所说的“malloc”是指与 malloc 函数相关的整个子系统 - malloc、free、realloc、calloc 以及您的 libc 可能实现的任何特殊函数。
解决方案 3:
简单来说,动态内存分配中有两个内存管理器:操作系统内存管理器和进程内存管理器(可以有多个)。操作系统内存管理器将“大块”内存分配给各个进程内存管理器。每个进程内存管理器都会跟踪已分配的段以及“已释放的段”。进程内存管理器不会将已释放的段返回给操作系统内存管理器,因为保留这些段效率更高,以防以后需要分配更多内存。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件