.net NET垃圾收集器真的是垃圾收集器吗?

.net NET垃圾收集器真的是垃圾收集器吗?,.net,garbage-collection,.net,Garbage Collection,我正在从事一个实现IDisposable接口的项目。在这个项目中,我发现我对垃圾收集器的了解可以用糟糕来形容。所以我开始阅读一些文档,最后在MSDN上找到了 你必须明白,在这一点上,我一直认为垃圾收集工是在下水道工作的人,他负责清理项目产生的废物。因此,我惊讶地看到以下内容: 垃圾收集器由CLR初始化后,会分配一段内存来存储和管理对象 文件后面的一段指出: 为了保留内存,垃圾收集器调用Win32 VirtualAlloc函数,并一次为托管应用程序保留一段内存。垃圾收集器还根据需要保留段,并通过调

我正在从事一个实现IDisposable接口的项目。在这个项目中,我发现我对垃圾收集器的了解可以用糟糕来形容。所以我开始阅读一些文档,最后在MSDN上找到了

你必须明白,在这一点上,我一直认为垃圾收集工是在下水道工作的人,他负责清理项目产生的废物。因此,我惊讶地看到以下内容:

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

文件后面的一段指出:

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

如果我理解正确,垃圾收集器实际上是.NET程序的内存管理器

我知道,它仍然收集垃圾。但这难道不等于把一个歌手叫做麦克风支架吗?当然,这是真的,但这并不是你花钱去看他们的原因。垃圾收集器显然不仅仅是废物处理,把它称为垃圾收集器似乎并不公平

总之:

我理解对了吗?还是我走远了


如果我理解正确的话:.NET开发人员为什么称它为垃圾收集器?

回收未使用内存的实体在.NET中被称为垃圾收集器,这可能是因为自50-60年代自动内存管理思想出现以来,它就被称为垃圾收集器


可能最初管理内存分配位置的问题被认为是独立的,因为手动内存管理也需要这样做。更深层次的问题是如何检测程序“垃圾”不再使用分配内存的哪些部分,并释放它们以供重用。显然,如果您首先知道内存是如何分配的,那么这就更容易了,因此您最好将分配内存的责任交给GC。

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

这是有意义的,如果你认为垃圾收集是能够发生的,最实用的方法是<强>垃圾收集机制<强> >内存分配机制< /强>(和参考解析策略,在压缩垃圾收集器的情况下)关系非常密切

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

在任何情况下,所有内存管理器都需要提供某种内存分配机制——因此这并不是它们之间的区别。然而,它们中只有少数能够自动收集垃圾,所以这就是我们在命名这些垃圾时所关注的。本质上,垃圾收集器实际上意味着垃圾收集内存管理器


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

它不仅仅是.NET。java、C++、Objto-C和其他语言也使用相同的术语。他们确实管理内存,但主要是清理留下的浪费

请想一想,分配内存实际上是一项相当琐碎的任务——大部分情况下调用
VirtualAlloc
。真正的艰苦工作和科学来自于清理进程使用的内存。NET GC确实是一个经过高度调优的引擎,很多人在清理垃圾(例如,处理内存中的固定对象、碎片堆、后台处理)时都花了大量精力优化GC,以使其不会影响性能


是的,你可以称它为内存管理器,但公平地说,它真正的明星技能是收集垃圾。

基本上是的,它是一个内存管理器,但同时它会删除未使用的对象以回收内存空间。删除垃圾对象后,它会对对象进行排序/排列,以便在下一个内存位置创建新对象


我建议您阅读《通过C#的CLR》一书,它对垃圾收集器有很好的解释。

+1对于“就像将歌手称为麦克风支架”,我猜理论上GC可以调用memmanager为自己分配内存块。它不一定是调用操作系统的那个。这也使得非托管代码可以直接调用memmanager(当然不会是GCed)。memmanager块映射可以用于GC的根标识过程。@MarcovandeVoort你说得对。我也对其进行了编辑来描述。