.NET框架的哪个部分负责分配内存。是GC吗?
答案 0 :(得分:4)
这是CLR,但与GC密切合作。 GC是CLR的一部分,所以它不是一个明确的分工。
分配发生在堆的自由部分的开始,这是一个非常简单和快速的操作。大对象堆(LOH)上的分配稍微复杂一些。
答案 1 :(得分:0)
访问http://www.codeproject.com/Articles/38069/Memory-Management-in-NET
记忆分配
"在.NET调试期间,通常使用Host进程托管.NET 使用VSHost.exe创建一个进程,为程序员提供 IDE的基本调试工具以及直接管理的内存 CLR的管理。部署应用程序后,CLR 以其可执行文件的名称创建进程并分配内存 直接通过Managed Heaps。
加载CLR时,通常会分配两个托管堆;一个是 用于小物体和其他用于大物体。我们通常称之为 SOH(小物体堆)和LOH(大物体堆)。现在什么时候 处理内存请求,然后将请求转移到CLR 根据这些托管堆的大小分配内存。 通常,当大小为时,SOH被分配给内存请求 内存小于83 KB(85,000字节)。如果它大于这个, 它从LOH分配内存。越来越多的内存.NET请求 以较小的块提交内存。"
进一步阅读本段后,在Windows(32位或64位)的帮助下它的CLR"分配"记忆。
"取消分配" 由GC管理。
"对象和与之关联的进程之间的关系 该对象通过Graph维护。垃圾收集时 触发它认为图中的每个对象都是垃圾和遍历 递归到与之关联的图的所有相关路径 寻找可到达对象的对象。每次垃圾 collector到达一个对象,它将对象标记为可达。现在 完成此任务后,垃圾收集器知道哪些对象 可达,哪些不是。无法访问的对象被视为 垃圾收集垃圾。"
答案 2 :(得分:0)
尽管有这个名字,还有很多现代的垃圾收集者和#34;实际上并没有将垃圾作为主要操作。相反,他们经常识别内存区域中的所有内容,这些内容并不是垃圾,而是将其移动到已知不包含任何有价物的地方。除非该区域包含一个固定的物体,否则#34;并且无法移动(在这种情况下事情变得更复杂),系统将知道移动内容的内存区域没有任何价值。
在许多这样的收集器中,一旦对象的最后一次引用消失,在用新数据盲目覆盖之前,将不再检查与该对象关联的内存字节。如果GC期望下一次使用旧的内存区域将用于保存新对象,它可能会一次性将所有字节清零,而不是零碎地满足分配,但如果GC期望它将被用作从其他地方复制的对象的目的地,它可能不会打扰。虽然只要存在任何引用,就保证对象保留在内存中,但是一旦对象的最后一个引用不再存在,就可能无法知道分配给该对象的每个内存字节是否实际上都被覆盖了。
虽然.NET确实有时必须采取肯定行动,但某些对象(例如那些类型覆盖Finalize
)的对象被发现已被抛弃,一般来说我认为最好考虑& #34; GC"因为它不是一个收集"的子系统。垃圾,而是作为垃圾收集的内存池的管理器,需要始终随时了解垃圾的所有内容。 虽然经理的职责包括GC周期的表现,但他们远远超出了这一点,而且我认为将GC周期与其他职责分开是有用的。