【问题标题】:Why does malloc_trim() only work with the main arena?为什么 malloc_trim() 只适用于主竞技场?
【发布时间】:2012-06-27 03:07:46
【问题描述】:

glibc 的 malloc 实现支持 'malloc_trim()' 调用,它允许应用程序将未使用的(即释放的内存块)释放回系统(实现细节:通过调用带有负数的 sbrk() 来减少程序的数据段争论)。但是,此功能仅适用于主竞技场。在多线程程序中,有多个存储释放块的区域。为什么这个调用也不会从其他 arena 释放内存?

【问题讨论】:

  • 可能是因为从分配的不同区域释放内存不是一个好主意......它也只能从堆顶释放内存。

标签: c++ c glibc


【解决方案1】:

除主要的竞技场外,其他竞技场可能是使用mmap 从系统分配的,因此sbrk 不能用于将该内存返回给系统。可以让 glibc 使用mremap 来缩小这些其他领域。还要注意malloc_trim只能在竞技场结束时返回内存,如果竞技场中间有空块,则无法释放该内存。

【讨论】:

  • 杰夫,感谢您的回复。我正在用 glibc 代码研究这个问题,并将用我找到的答案更新这个问题。
  • Geoff,谢谢,您的回答是正确的。 'sbrk' 可用于仅收缩程序的数据段,因此 malloc_trim 仅适用于位于那里的 main arena。
猜你喜欢
  • 2013-11-25
  • 1970-01-01
  • 2012-03-01
  • 2012-06-07
  • 1970-01-01
  • 2014-03-11
  • 2018-01-16
  • 1970-01-01
  • 2016-01-09
相关资源
最近更新 更多