我正在开发一个实现IDisposable接口的项目。在这个项目中,我发现我对GarbageCollector的了解最好。所以我开始阅读一些文档,最后我在MSDN上找到了 the "Fundamentals of Garbage Collection" article 。
你必须明白,在这一点上,我一直认为GarbageCollector是在下水道工作的人,他清理了来自该计划的废物。因此,我很惊讶地阅读了以下snippet:
CLR初始化垃圾收集器后,它会分配一段内存来存储和管理对象。
后面的一段文件指出:
为了保留内存,垃圾收集器调用Win32 VirtualAlloc函数,并为托管应用程序一次保留一段内存。垃圾收集器还根据需要保留段,并通过调用Win32 VirtualFree函数将段释放回操作系统(在清除任何对象之后)。
如果我理解正确,GarbageCollector实际上是.NET程序的 MemoryManager !
我知道,它仍然收集垃圾。但这不就像把歌手称为麦克风持有人吗?当然,这是真的,但几乎不是你付钱看他们的原因。 GarbageCollector确实比垃圾处理更加明显,将它称为GarbageCollector几乎不公平。
总之:
我理解正确吗?还是我离开了?
如果我理解正确:为什么.NET开发人员称之为GarbageCollector?
答案 0 :(得分:4)
这不仅仅是.NET。 Java,C ++,Objective-C和其他语言也使用相同的术语。他们确实管理记忆,但主要是为了清理留下的浪费。
考虑一下这一点,分配内存实际上是一项相当简单的任务 - 大部分都在调用VirtualAlloc
。清理过程使用的内存时,真正的努力和科学就来了。 .NET GC确实是一个高度调整的引擎,很多人在清理垃圾时花了很多精力来优化GC。处理内存中的固定对象,碎片堆,后台处理,以免影响性能。
所以,你可以把它称为MemoryManager,但公平地说,真正的明星技能就是收集垃圾。
答案 1 :(得分:3)
你是对的,垃圾收集器 本质上是一种内存管理器。
如果考虑到这一点,这是有道理的,因为垃圾收集能够发生,最实用的方法是垃圾收集机制和内存分配机制 (以及压缩垃圾收集器的参考解决策略)密切相关。
原因是垃圾收集器需要执行大量簿记才能运行。为了可靠地执行簿记,除其他外,它需要有关于发生的分配的信息。实现这一目标最明显的方法是让垃圾收集器提供自己的内存分配例程。这可以通过提供新的内存分配器接口,替代语言提供的标准接口(以及可能利用它,如评论中的Marco所提到的)或通过拦截并基本上替换语言的标准内存分配器有自己的。
在任何情况下,所有内存管理器都需要提供某种内存分配机制 - 因此不能区分它们。但是,其中只有少数几个可以自动收集垃圾,这就是我们在命名垃圾时所关注的内容。实质上,垃圾收集器实际上意味着垃圾收集内存管理器。
现在它的通用名称确实听起来有点误导,但不是.NET开发人员提出它。在Lisp中,这些内存管理器一直被称为垃圾收集器,可能早在概念的第一个存在。我想,它是出于历史原因而被保留的。
答案 2 :(得分:2)
回收未使用内存的实体在.Net中被称为垃圾收集器,这可能是因为自从50年代到60年代自动内存管理的概念开始以来它就被调用了。
最初管理内存应该分配的问题可能是分开的,因为这也是手动内存管理所必需的。更深层次的问题是如何检测程序不再使用已分配内存的哪些部分,“垃圾”,并释放它们以供重用。显然,如果你知道如何首先分配内存,这会更容易,所以你也可以负责为GC分配内存。
答案 3 :(得分:0)
基本上是的,它是一个内存管理器,但同时它删除了未使用的对象以回收内存空间。删除垃圾对象后,它会对对象进行排序/排列,以便在下一个内存位置创建新对象。
我建议你读一本书“通过C#CLR”,它对垃圾收集器有很好的解释。