我正在从事一个实现IDisposable接口的项目。在这个项目中,我发现我对GarbageCollector的了解可以说是糟糕的。因此,我开始阅读一些文档,最后在MSDN上找到了“垃圾收集的基本原理”文章。
你必须明白,在这一点上,我一直认为GarbageCollector是在下水道工作的人,他清理了该项目产生的废物。因此,我很惊讶地阅读了下面的片段
在CLR初始化垃圾收集器之后,它会分配一段内存来存储和管理对象。
该文件随后在一段中指出:
为了保留内存,垃圾收集器调用Win32 VirtualAlloc函数,并为托管应用程序每次预留一段内存。垃圾收集器还根据需要保留段,并通过调用Win32 VirtualFree函数将段释放回操作系统(清除掉它们的任何对象之后)。
如果我正确理解的话,GarbageCollector实际上就是.NET程序的MemoryManager!
我知道,它还在收集垃圾。但这不就像叫歌手麦克风持有者一样吗?当然,这是真的,但这并不是你花钱去看他们的原因。GarbageCollector显然不仅仅是垃圾处理,称其为GarbageCollector似乎并不公平。
所以结论是:
我理解得对吗?还是我离得太远了?
如果我的理解是正确的:为什么.NET开发人员称它为GarbageCollector?
发布于 2013-07-17 08:26:42
没错,垃圾收集器本质上是一种内存管理器。
如果考虑到要进行垃圾收集,最实际的方法是将--垃圾收集机制和--内存分配机制(以及压缩垃圾收集器情况下的参考解析策略)称为,这是很有意义的。
原因是垃圾收集器需要执行大量簿记才能操作。要可靠地执行簿记,除其他外,它需要了解所进行的分配的信息。实现这一目标的最明显方法是由垃圾收集器提供自己的内存分配例程。这可以通过提供一个新的内存分配器接口来实现,它可以替代语言提供的标准接口(并可能利用它,正如Marco在注释中提到的那样),也可以通过截取和替换语言的标准内存分配器来实现。
无论如何,所有内存管理器都需要提供某种内存分配机制--所以这并不能区别它们。然而,实际上只有少数人能够自动收集垃圾,所以这就是我们在命名那些垃圾时所关注的问题。实际上,垃圾收集器实际上意味着垃圾收集内存管理器。
现在,它的共同名称听起来可能有点误导,但不是.NET开发人员想出来的。在Lisp中,这样的内存管理器一直被称为垃圾收集器,可能早在这个概念的第一次存在之时就已经存在了。我想,这是出于历史原因而保持的。
发布于 2013-07-17 08:27:14
它不仅仅是.NET,Java、C++、Objective和其他语言也使用相同的术语。他们确实管理内存,但主要是为了清理遗留下来的垃圾。
考虑一下,分配内存是一项相当琐碎的任务--主要是调用VirtualAlloc。真正的努力和科学,是在清理一个过程所使用的记忆时出现的。实际上,.NET GC是一个高度调优的引擎,很多人在清理垃圾方面花费了大量的精力,例如处理内存中的固定对象、碎片堆、后台处理,以便不影响性能。
所以,你可以把它叫做MemoryManager,但公平地说,真正的明星技能就是收集垃圾。
发布于 2013-07-17 08:25:28
回收未使用内存的实体在.Net中被称为垃圾收集器,可能是因为这是自50年代-60年代自动内存管理概念提出以来一直被称为垃圾收集器的实体。
可能最初管理内存分配位置的问题被认为是单独的,因为手动内存管理也需要这样做。更深层次的问题是如何检测分配的内存中哪些部分不再被程序“垃圾”所使用,并释放它们以供重用。显然,如果您首先知道内存是如何分配的,那么这就更容易了,所以您最好将内存分配的责任交给GC。
https://stackoverflow.com/questions/17694669
复制相似问题