是什么影响了GC的时间安排?

时间:2010-04-24 00:01:00

标签: .net garbage-collection

我知道无法知道GC何时发生,但有些因素会告诉您它可能发生的频率/时间。这些是什么因素?一个是创建了多少个对象等。

3 个答案:

答案 0 :(得分:4)

简短的回答是以下事件触发了一个收集周期:

分配超过Gen0阈值

特定代的集合在达到该代的内存阈值时发生。在.NET版本1.0的实现中,第0代,第1代和第2代的初始阈值分别为256千字节(KB),2兆字节(MB)和10 MB。请注意,GC可以根据应用程序的分配模式动态调整这些阈值。大于85 KB的对象将自动放置在大对象堆中。

System.GC.Collect()被称为

分配仅发生在Gen0中。在每个GC之后,Gen0为空。新的分配将填满Gen0,下一代GC将会发生,依此类推。手动调用GC.Collect()的问题在于,最终可能会比您预测的更频繁地调用它(由于CLR也会调用它)并且性能下降,因为您在其日程安排之前触发GC周期

系统内存不足

这受到系统上其他进程的影响,这意味着除了确保在流程和组件中正确清理资源外,您实际上无法控制它。

答案 1 :(得分:1)

当满足下列条件之一时,就会发生垃圾收集:

系统物理内存较低。

托管堆上已分配对象使用的内存超过了可接受的阈值。这意味着托管堆上已超出可接受内存使用量的阈值。在该过程运行时,该阈值会不断调整。

调用GC.Collect方法。几乎在所有情况下,您都不必调用此方法,因为垃圾收集器会持续运行。此方法主要用于独特的情况和测试。

答案 2 :(得分:0)

对于桌面版C#,有几个因素:

  • 内存分配量(每次分配1 MB,触发GC级别1)
  • 系统内存压力(如果物理内存量变低,可能会触发GC)
  • 虚拟内存提交(如果系统需要提交内存页面,则可能会在操作之前触发GC)
  • 从代码中编程触发。
  • GC可以使用其他启发式方法来触发收集。

如果您对.Net framework 3.0及更高版本中即将发生3级集合感兴趣,可以订阅GC通知,以便在它们发生之前得到通知:RegisterForFullGCNotification