当前位置: 首页 > 面试题库 >

当使用free()时,内存使用不会减少

宋飞舟
2023-03-14
问题内容

我正在编写独立于操作系统的无锁队列,到目前为止,它工作得很好,但是内存管理方面的问题很小。我不确定它的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


问题答案:

在许多操作系统上,free()不会再次使内存可供OS使用,而只能“用于”对的新调用malloc()。这就是为什么您看不到内存使用量从外部下降的原因,但是当您通过线程增加新分配的数量时,内存将被重新使用,因此总使用量不会浪费。



 类似资料:
  • 实际上,我的问题和这个问题非常相似,但这篇文章只关注C#。最近我读到一篇文章,说java会将一些短类型(如short)提升到内存中的4字节,即使有些位不被使用,所以它不能减少使用。(是真的吗?) 所以我的问题是语言,特别是C、C++和java(正如Manish在这篇文章中谈到java时所说),如何处理小型数据类型的内存分配。参考资料或任何方法来找出它是首选的。谢谢

  • 我正在研究一种需要对大矩阵进行数学运算的算法。基本上,该算法包括以下步骤: 输入:大小为n的两个向量u和v > 对于两个矩阵中的每个条目,应用一个函数f。返回两个矩阵M_u,M_v 求M_的本征值和本征向量。对于i=0,返回e_i,ev_i,。。。,n-1 计算每个特征向量的外积。返回一个矩阵O_i=e_i*转置(e_i),i=0,。。。,n-1 用e_i=e_i delta_i调整每个特征值,其

  • 我在学计算机工程,我有一些电子课程。我从我的两位教授(这些课程)那里听说,可以避免使用函数(在、等之后),因为分配的内存空间可能不会再次用于分配其他内存。也就是说,例如,如果您分配4个字节,然后释放它们,您将有4个字节的空间,可能不会再次分配:您将有一个洞。 我认为这太疯狂了:你不可能有一个在堆上分配内存而不释放内存的非玩具程序。但是我没有知识来解释为什么它如此重要,对于每一个malloc()必须

  • free 命令用来显示系统内存状态,包括系统物理内存、虚拟内存(swap 交换分区)、共享内存和系统缓存的使用情况,其输出和 top 命令的内存部分非常相似。 free 命令的基本格式如下: [root@localhost ~]# free [选项] 表 1 罗列出了此命令常用的选项及各自的含义。 表 1 free 命令常用选项及含义 选项 含义 -b 以 Byte(字节)为单位,显示内存使用情况

  • 问题内容: 我正在尝试将几个文件加载到内存中。这些文件具有以下3种格式之一: 字符串TAB int 字符串TAB浮动 int TAB浮点数。 的确,它们是ngram静态文件,以防解决方案的出现。例如: 目前,我正在执行的伪代码是 令我惊讶的是,尽管磁盘中文件的总大小约为21 mb,但是将其加载到内存中时,该过程将占用120-180 mb的内存!(整个python应用程序不会将其他任何数据加载到内存

  • 我正在使用spring boot开发客户端应用程序。在运行spring boot应用程序(使用完全可执行的jar)时,x64服务器的内存占用约为190M,x86服务器的内存占用约为110M。 我的jvm选项是(-xmx64m-xms64m-xx:maxpermsize=64m-server),为什么在x64服务器中,内存占用这么大?如何将内存使用量降低到150M以下? 多谢了。