在.NET中显式调用垃圾收集

时间:2014-11-20 08:57:49

标签: .net garbage-collection

我的理解是,在Java中,如果我显式地调用了垃圾收集,那么所有调用都会向垃圾收集器“提示”已经请求了一个集合。

基于阅读这里的文档:http://msdn.microsoft.com/en-us/library/y46kxc5e(v=vs.110).aspx我是否正确地说这不是.NET的情况,如果我要求垃圾收集,那么运行垃圾收集?

文档说明如下:

  

使用此方法尝试回收无法访问的内存。但是,使用此方法并不能保证回收指定代中的所有无法访问的内存。   如果实现了对象老化,则垃圾收集器不会收集具有高于指定生成的世代号的对象。如果未实现对象老化,则垃圾收集器会在垃圾回收期间考虑所有对象。

现在对我而言,暗示垃圾收集器在你打电话时运行 - 或者我读错了?

如果只是一个提示,那么内存分析器如何工作呢?

我所问过的每个人都告诉我,这只是在.NET中的提示,所以如果现在不是这样,那么以前的.NET版本是不是这样呢?

2 个答案:

答案 0 :(得分:3)

“对象老化”是一种笨拙的方式,说垃圾收集器支持多代。例如,.NET的桌面版本使用3代,Compact Framework仅使用1代。它是CLR实现细节。作为对象“年龄”,换句话说,活着更久并且在收藏中存活,它们将进入更高编号的世代。这是一种优化,GC对不太可能需要收集的对象的工作量会减少。

因此在CF的情况下,无论您作为参数传递什么,都会收集整个堆。在桌面版本中,收集了与论据以及年轻一代相同的代。换句话说,GC.Collect(1)将收集gen#0和gen#1,而不会对gen#2做任何事情。

答案 1 :(得分:1)

这取决于您如何触发GC。

GCCollectionMode

  

Default此枚举的默认设置,当前为强制。

     

Forced强制立即进行垃圾收集。

     

Optimized允许垃圾收集器确定当前时间是否是回收对象的最佳时间。

如果调用无参数重载或传递GCCollectionMode.Default,它当前会强制执行GC,但从理论上讲,在将来的.NET版本中,行为可能会发生变化。

如果您通过GCCollectionMode.Forced,则会强制立即执行GC。

如果您通过GCCollectionMode.Optimized,那么它只是一个提示。我不知道运行时对此提示的重视程度。

因此,如果您要强制使用GC或确保它只是提示,请使用Collect(int generation, GCCollectionMode mode)重载。