3

我已经看到了多个建议运行的 anwsers GC.Collect(GC.MaxGeneration)
既然该方法GC.Collect()会收集所有现有的世代,那么两者之间有什么区别吗?

也许如果只有两代而不是三代,GC 将收集两代,并且不会尝试收集第三代,这将提高性能。但说真的,这有意义吗?

4

5 回答 5

2

唯一的区别是GC.Collect()会使用GCCollectionMode.OptimizedGC.Collect(GC.MaxGeneration)会使用GCCollectionMode.Default(至少在 .NET Framework 4.5 中)。在重载中,您也可以手动指定收集模式。

/// <summary>Specifies the behavior for a forced garbage collection.</summary>
public enum GCCollectionMode
{
    /// <summary>The default setting for this enumeration, which is currently <see cref="F:System.GCCollectionMode.Forced" />. </summary>
    Default,
    /// <summary>Forces the garbage collection to occur immediately.</summary>
    Forced,
    /// <summary>Allows the garbage collector to determine whether the current time is optimal to reclaim objects. </summary>
    Optimized
}
于 2013-04-08T10:32:04.867 回答
1

GC.Collect() 可能什么都不做,因为它对 GCCollectionMode 使用“优化”

MSDN on Optimized->允许垃圾收集器判断当前时间是否是回收对象的最佳时间。

GC.Collect(GC.MaxGeneration) 对 GCCollectionMode 使用“强制”

MSDN on Forced -> 强制垃圾收集立即发生。

两者都将尝试为所有世代​​回收。

于 2013-04-08T10:42:33.200 回答
0

GC.Collect()使用GCCollectionMode.Default,所以GC.Collect(GC.MaxGeneration)

所以,和那时没有区别!


根据 MSDN

GCCollectionMode 枚举

Default :此枚举的默认设置,当前为 Forced。
Forced :强制垃圾收集立即发生。
Optimized :允许垃圾收集器确定当前时间是否是回收对象的最佳时间。

使用反射器:

[MethodImpl(MethodImplOptions.InternalCall)]
private static void nativeCollectGeneration(int generation, int mode); 

public static void Collect()
{
  GC.nativeCollectGeneration(-1, 0);
}

public static void Collect(int generation)
{
  GC.Collect(generation, GCCollectionMode.Default);
}

PS0GCCollectionMode.Default是一样的。

于 2013-04-08T10:40:29.907 回答
0

标准(系统启动)垃圾收集的行为是这样的:

  1. 从 GenX 中删除所有没有根的项目(即从活动代码中引用)
  2. 将所有剩余项目从 GenX 提升到 GenX+1
  3. 如果 GenX+1 中没有足够的空间容纳新项目,则对 GenX+1 重复上述操作

所以,一个标准的集合可能只收集 Gen0,并将一些数据洗牌到 Gen1,然后停止。这有助于延长到达 Gen2 的对象的寿命:Gen2 的收集频率远低于 Gen0,因此到达 Gen2 的对象可能会停留一段时间。

如果对所有代强制收集,Gen2 中的对象将立即被收集。这将释放更多内存,但也会对性能产生影响。

最重要的是,任何收藏品都会将根深蒂固的物品推广到下一代。这是手动收集不好的原因之一:项目将不必要地提升到 Gen1/2,然后实际上会停留更长时间(除非您反复使用手动 GC,这只会使问题更加复杂......)。

于 2013-04-08T10:51:50.167 回答
-1

这是 GC 类的内部代码

// Forces a collection of all generations from 0 through Generation.
//
public static void Collect(int generation) {
    Collect(generation, GCCollectionMode.Default);
    }

// Garbage Collect all generations.
//
[System.Security.SecuritySafeCritical]  // auto-generated
public static void Collect() {
    //-1 says to GC all generations.
    _Collect(-1, (int)GCCollectionMode.Default);
}

[System.Security.SecuritySafeCritical]  // auto-generated
public static void Collect(int generation, GCCollectionMode mode)
{
    if (generation<0)
    {
        throw new ArgumentOutOfRangeException("generation", Environment.GetResourceString("ArgumentOutOfRange_GenericPositive"));
    }
    if ((mode < GCCollectionMode.Default) || (mode > GCCollectionMode.Optimized))
    {
        throw new ArgumentOutOfRangeException(Environment.GetResourceString("ArgumentOutOfRange_Enum"));
    }
    Contract.EndContractBlock();
    _Collect(generation, (int)mode);
}

在这里,您可以看到您的两个方法调用都使用两个参数调用了 Collect 方法。收集(int genration,GCCollectionMode 模式)。

于 2013-04-08T10:55:45.713 回答