【问题标题】:When does GC decide to collect generation 2?GC 什么时候决定收集第 2 代?
【发布时间】:2011-12-20 21:14:00
【问题描述】:

白天我在我们的 Windows 服务中看到了很多 gen 2 集合。

GC 什么时候决定进行全量收集而不是只收集 Gen1 和 Gen0 还是只收集 Gen0?

【问题讨论】:

  • 可能是在感到释放一些内存的压力时。也许当系统空闲时。只是猜测。

标签: .net garbage-collection


【解决方案1】:

阅读http://msdn.microsoft.com/en-us/library/0xy59wtx.aspx 和链接文章了解更多信息。通常,“必要时”会收集 gen2。

大对象堆 (LOH) 可能会导致 Gen2 收集过多。当 LOH 被填满时,它将触发一个完整的收集。如果您的应用程序分配和释放大量大型对象(80K 或更大),那很可能是您的问题。

CLR Inside Out: Large Object Heap Uncovered

还可以考虑在您的服务中使用服务器垃圾收集器。它通常会提供更好的性能(更少的集合)。将此添加到您的 app.config 文件中:

<configuration
   <runtime>
      <gcServer enabled="true"/>
   </runtime>
</configuration> 

【讨论】:

  • 我们的服务检查是否有工作要做,并在线程池中排队。我认为那些 ThreadPool 线程是唯一可以升级到 Gen2 的线程。我们不分配大对象。但是当系统内存不足时,我会看到 Gen2 集合。当您使用多核 CPU 时,AFAIK 服务器模式是默认的。
  • @Peri 如果您的系统内存不足,它将触发完整的 GC。系统需要空间回来!您可能想看看添加更多 RAM 的可能性。
  • @Peri:不,服务器模式不是默认的。当您使用多核时,并发 GC 是默认设置,但这仍然是客户端 GC。如果你想要服务器 GC,你必须在你的 app.config 文件中这样说。另外,您确定不分配大对象吗?在 64 位系统上,只有 10,000 个项目的列表需要一个大于 80 KB 的后备数组。
  • 我想我在考虑 ASP.NET 应用程序。在 ASP.NET 中默认为服务器模式。
【解决方案2】:

当满足以下条件之一时,通常会触发一个集合(在任何一代下)

  • 分配超过阈值。我模糊地记得这是基于当前需求的动态。任何人都可以确认/否认吗?
  • 内存不足
  • 通过 GC.Collect() 调用

我可能还缺少另一种情况,但通常就是这样。第一个是通常开始收集的东西,考虑到收集 G2 比 G0 (相对)更昂贵,你看到的更少。


解决评论中的问题:
每一代都有一个阈值,当命中时会触发一个集合。 Gen0 可能是 5mb,当它被填满时会被触发。 GC运行后,如果你还有里面有5mb,我相信它会增加限制。如果没有,那么每次分配都会触发一个集合,你就会遇到问题。 Gen2 可能为 20mb(注意我在这里编造数字),同样的逻辑也适用于那里。

对于一个教科书的例子,让我们看一个简单的场景。

  1. 新应用分配的对象和所有都放在 Gen0 中,总共 3MB 的数据。 (这并非总是如此,但假装是这样)
  2. GC 命中,其中 1 MB 移动到 G1,其余的被清理。
  3. G0 现在是免费的,G1 中有 1MB。
  4. 创建了更多对象,并发生了更多 GC。一段时间后,G1 满员,有些人被转移到 G2。
  5. 对象会一直留在那里直到 G2 已满,然后它们会被清理如果不使用。如果一个对象仍在被引用,它将停留在 G2 中,直到它可以被清理

完整的 GC 很昂贵,而且我已经看到几天没有发生任何事情。当然这是在具有 >64GB 可用内存的系统上,并且不需要它。

【讨论】:

  • 第一点是什么意思?例如,当我分配
  • 我不确定我是否理解这个例子。我认为当对象在 GC 中存活(仍然存在)时,它们会被移到老一代,而不是当代“满”时。
  • 正确,当 GC 发生时是关键,并且“满”将启动它(或上面列出的其他 2 个原因之一)。我只是以它为例。
  • GC 算法似乎没有考虑系统内存的过剩,即使它应该在 SustainedLowLatency 模式下运行。
  • 另外,触发 GC 的另一个重要标准是当临时段需要增长时,要么因为它完全没有空间,要么因为堆碎片。如果您正在处理大量数据和延迟 SLA 目标,这尤其令人讨厌,因为您的 GC 事件将与数据突发高度相关 - 正是当您不希望发生 GC 时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
相关资源
最近更新 更多