Boehm GC 会释放内存吗?

问题描述 投票:0回答:1

我一直在研究 Boehm GC(用于 C/C++),在我看来(在 Windows 上,但也可能在 Linux 上)GC 默认情况下永远不会释放它所请求的内存。 值得注意的是,我使用的是旧版本的 Boehm GC (7.6)。

处理内存分配的部分似乎位于os_dep.c中,在Windows上看起来内存是通过VirtualAlloc分配的。我可以看到,当我创建新对象时,GC 会锁定 GC_win32_get_mem 中的内存。 为了返回该内存,需要调用 VirtualFree,但这似乎永远不会发生(有一个 GC_win32_free_heap 函数,但似乎只被某些 GC 库测试套件使用)。

有一个 cmake 标志 - USE_MUNMAP。从文档看来,使用这个标志,GC 有时会返回一些它分配的内存。在这里,我可以看到 VirtualFree 是从 os_dep.c 中 #ifdef 内部的一些代码调用的,并使用此标志进行构建,我可以对其进行调试,并看到它现在有时会调用 VirtualFree。

我的理解是否正确,默认情况下,Boehm GC 不会释放已分配的内存?有谁了解有关“USE_MUNMAP”标志的更多信息 - 使用此标志的唯一区别是 GC 将(在满足某些条件的某些情况下)返回已分配的内存,还是还有更多区别? 了解这种设计是否是出于性能原因而选择的也很有趣,我可以想象调用 VirtualFree 会引起一些性能开销,也许还会产生内存碎片?这就是默认情况下它根本不返回内存的原因还是还有其他原因?

如果有人能阐明这一点,我将非常感激。

(编辑于 2024 年 7 月 3 日,我之前在这篇文章中提到过操作系统,这可能会引起一些混乱。我只想知道 Boehm GC 是否在它不再分配的内存上进行适当的免费调用使用中。)

c memory garbage-collection boehm-gc
1个回答
0
投票

BDWGC v8.0.0(及更高版本)默认将未使用的内存返回给操作系统(在大多数目标平台上)。对于较旧的 BDWGC 版本,您可以传递

--enable-memory-unmapping
标志来配置以打开该功能。

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