.NET GarbageCollector真的是GarbageCollector吗?

Jor*_*rdy 5 .net garbage-collection

我正在开发一个实现IDisposable接口的项目.在这个项目中,我发现我对GarbageCollector的了解最好.所以我开始阅读一些文档,最后我在MSDN上找到了"垃圾收集基础"一文.

你必须明白,在这一点上,我一直认为GarbageCollector是在下水道工作的人,他清理了来自该计划的废物.因此,我很惊讶地阅读以下片段:

垃圾回收器由CLR初始化后,它会分配一段内存来存储和管理对象.

一段后来,该文件指出:

为了保留内存,垃圾收集器调用Win32 VirtualAlloc函数,并为托管应用程序一次保留一段内存.垃圾收集器还根据需要保留段,并通过调用Win32 VirtualFree函数将段释放回操作系统(在清除任何对象之后).

如果我理解正确,GarbageCollector实际上是.NET程序的MemoryManager!

我知道,它仍然收集垃圾.但这不就像把歌手称为麦克风持有人吗?当然,这是真的,但几乎不是你付钱看他们的原因.GarbageCollector确实比垃圾处理更加明显,将它称为GarbageCollector几乎不公平.

总之:

我理解正确吗?还是我离开了?

如果我理解正确:为什么.NET开发人员称它为GarbageCollector?

The*_*kis 3

你是对的,垃圾收集器本质上一种内存管理器

如果您认为要进行垃圾收集,最实用的方法是垃圾收集机制内存分配机制(以及引用解析策略,如果是压缩垃圾收集器),那么这是有道理的。密切相关

其原因是垃圾收集器需要执行大量簿记才能运行。为了可靠地进行簿记,除其他外,它需要获得有关所发生的分配的信息。实现这一点的最明显的方法是让垃圾收集器提供自己的内存分配例程。这可以通过提供一个新的内存分配器接口来完成,替代该语言提供的标准内存分配器接口(并且可能利用它,正如 Marco 在评论中提到的),或者通过拦截并基本上替换该语言的标准内存分配器它自己的。

无论如何,所有内存管理器都需要提供某种内存分配机制 - 因此这并不是它们的区别所在。然而,其中只有少数能够真正自动收集垃圾,因此这就是我们在命名那些能够自动收集垃圾的垃圾时所关注的重点。从本质上讲,垃圾收集器实际上意味着垃圾收集内存管理器

现在,它的通用名称听起来确实有点误导,但它并不是 .NET 开发人员想出的。这种内存管理器一直被称为垃圾收集器,可能早在 Lisp 中这个概念首次存在时就被称为垃圾收集器。我想,出于历史原因,它一直保持这样的状态。