高效的垃圾收集

时间:2013-12-19 11:36:27

标签: c# garbage-collection

考虑以下对象

class someObject;
{
   public objectA A{get;set;}
   public objectB B{get;set;}
   public objectC C{get;set;}
   public objectD D{get;set;}
   //...
}

在某些时候ObjectD不再需要,但someObject的实例仍然存在,并且会在几个小时内完成,objectD会占用大量内存,因此在其角色完成后我把它设置为null。

  • 这是否意味着内存将尽快从ObjectD释放 我把它设为null?
  • 如果一个对象在某些范围内设置了很长时间,那么.NET会做什么 关于它?

6 个答案:

答案 0 :(得分:6)

  

这是否意味着一旦我设置,内存将从ObjectD中释放出来   它为空?

它不是null的对象集 - 它对内存中对象的引用设置为null。并且对象将存在,直到垃圾收集器将收集它(如果您没有对此对象的任何其他引用)。

查看Fundamentals of Garbage Collection

答案 1 :(得分:1)

GC将收集不再引用的项目。但是,当它发生时,这取决于它自己。

所以:是的,将ObjectD的引用设置为null将使GC能够收集它。不,它(很可能)不会立即发生。

答案 2 :(得分:1)

您可以将对象设置为null,然后使用Collect方法Gc.Collect()。它执行所有代的阻塞垃圾收集。所有对象,无论它们在内存中存在多长时间,都被考虑收集。

答案 3 :(得分:1)

如果将D设置为null,则可以在调用GC时从内存中删除它。但是在对象中使用空字段不是一个好的解决方案。如果它需要临时的,也许它应该是一个局部变量!?

答案 4 :(得分:1)

if an object sets for so long unused in some scope what does .NET do about it?

为了回收内存,垃圾收集器收集并销毁不再可用的对象,当没有对它的引用时,所有引用都设置为null,否则对它的所有引用都来自其他可能的对象集。集合的过程涉及将可用对象移动到存储器中并回收不再使用的对象所使用的存储器。存在于集合中的对象会自动升级到下一代

答案 5 :(得分:1)

  1. 通过将内存设置为NULL,不会立即释放内存。内存将被标记为垃圾回收。 .Net GC方案有点高效。如果您担心,可以强制执行GC循环:See this stack overflow article on the yin/yang of this.

  2. 如果设置未使用,.Net将不会执行任何操作。也就是说,如果你没有特别“废除”引用,.Net没有理由期望在某个时刻(立即)不需要该对象。如果你需要它并且.Net“暂时从内存中删除它”,它将需要以某种方式重新创建它,使用有关类的状态的信息......恢复信息的明显选择是类本身。所以删除它不是一个真正的选择。

  3. 通过较慢但更大的内存访问的各个阶段卸载它通常是现代计算机中使用的策略:(1)将内存存储在本地片上存储器缓存中以用于最近使用的数据/程序。 (2)将存储器存储在片外存储器芯片中。 (3)将内存存储在虚拟媒体(例如硬盘)中。

    在一天结束时,您可能最清楚何时取消引用,并且框架最了解何时/何处存储对象的内存。有一些例外,例如游戏编程,GC机制可能会导致打嗝。但总的来说,只要你这样做,系统就会很好。

    这有用吗?