2013-12-19 46 views
3

考虑以下对象有效的垃圾收集

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

在某些时候,不再需要ObjectDsomeObject实例仍然存在,并会为几个小时这样做,objectD占用很多的内存,以便其作用后,完成后,我确实将它设置为null。

  • 是否意味着存储将得到释放ObjectD只要 我将它设置为空?
  • 如果一个对象在某个范围内设置了这么久未使用,那么.NET对它做什么 ?

回答

6

是否意味着内存将得到ObjectD尽快解脱出来,因​​为我设置 为null?

它不反对套到null - 其参考记忆套反对null。对象将存在,直到垃圾收集器将收集它(如果您没有任何其他引用此对象)。

就以Fundamentals of Garbage Collection

+0

所以垃圾收集器收集时没有更多的引用?有没有办法让GC对某些对象不择手段? – FPGA

+3

请注意,垃圾收集器的习惯实际上根据您选择的构建配置而有所不同。发布版本在修剪未使用的对象时更具侵略性 – Liath

+1

@ user1492051您可以手动运行垃圾回收,但这是非常昂贵的操作,它会影响应用程序中的所有垃圾对象,而不仅仅是这一个 –

1

的GC一看就会收集不再被引用的项目。但是,当它达到它自己时,

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

1

您可以将对象设置为空,然后使用Collect方法Gc.Collect()。它执行所有世代的阻塞垃圾收集。所有对象,无论他们在记忆中存在多久,都被考虑用于收集。

+2

我警告不要自行强制垃圾收集。第二代和第三代物体可以花费更多的时间和精力来回收,通过自己强制追加集合(虽然可能会释放一些资源),但更有可能会迫使物品进入后代,并且实际上会损坏您的物品性能。 – Liath

1

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

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

回收内存垃圾收集器收集并销毁它们不再是当有任何对它的引用,所有引用都设置为空,否则它的所有引用其他对象可以收集的对象。集合的过程涉及将可用对象移入内存并回收不再使用的对象所使用的内存。一个集合中存活的对象会自动提升到下一代

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

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

通过的速度较慢,但​​是,更大的内存访问各个阶段卸载它通常是现代计算机使用的策略:对于最新的数据/程序在本地片上内存缓存(S)(1)店铺内存使用。 (2)将存储器存储在片外存储器芯片中。 (3)将存储器存储在虚拟介质(例如硬盘驱动器)中。

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

对您有帮助吗?