2010-04-24 60 views
2

我知道不可能知道什么时候发生GC,但有些因素会告诉您发生的频率/时间。这些是什么因素?一个是有多少个对象被创建,当满足下列条件之一为真发生等什么影响GC的时间?

+0

我不知道你的问题的答案,但我只想指出,有几个GC的实现。我知道三个:工作站,服务器和压缩。另外,如果你走向异国情调,Singularity项目有五个类似的东西。 – 2010-04-24 00:08:17

+0

当然还有Mono,Portable.NET,.NET Compact Framework,Rotor ... – 2010-04-24 03:45:02

回答

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循环。

系统是在内存不足的情况

这是由这意味着你真的有超过它不是确保您在流程和组件正确地清理资源等无法控制的系统上的其他进程的影响。

+0

这些是我在另一个网站上看到的并且被遗忘的因素。谢谢。 – dotnetdev 2010-04-26 13:22:00

1

垃圾收集:

该系统具有低的物理内存。

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

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

0

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

  • 内存分配(每次1 MB被分配一个GC水平1被触发)
  • 系统内存压力的金额(如金额物理内存空间不足,GC可能被触发)
  • 虚拟内存提交(如果系统要对提交内存页面,则GC可在操作之前)
  • 纲领性从代码触发触发。
  • GC可以使用其他启发式来触发集合。

如果您有兴趣在3级集合即将发生.Net框架3。0和以上有GC通知,你可以订阅,在它们发生之前得到通知:RegisterForFullGCNotification

+0

我相信,如果您使用Server GC而不是Workstation GC,这是桌面应用程序的默认设置,则只能使用'RegistorForFullGCNotification'。 – 2010-04-24 00:17:14

+0

@Scott Dorman,您可以注册任何类型的GC。 – 2010-04-24 00:19:29

+0

对不起......检查此页以获取更多详细信息:http://msdn.microsoft.com/en-us/library/cc713687.aspx'此功能仅在禁用并发垃圾收集时可用。默认情况下,除非您在托管环境中运行并且主机为您更改了配置,否则将启用并发垃圾收集。“# – 2010-04-24 00:22:42

相关问题