什么时候可以叫GC.Colect?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (36)

想到的一个例子是一种服务,它每隔一段时间醒来,执行一些任务,然后睡上很长一段时间。在这种情况下,强制收集可能是一个好主意,以防止即将空闲的进程持有超过所需的内存。

是否有其他可以接受的情况?GC.Collect?

提问于
用户回答回答于

如果你有充分的理由相信一组重要的对象--尤其是那些你怀疑是第1代和第2代的对象--现在有资格进行垃圾收集,那么现在正是收集性能小的合适时机。

这方面的一个很好的例子是,如果刚刚关闭了一个大表单。知道,所有UI控件现在都可以被垃圾收集,在表单关闭时暂停很短的时间,用户可能不会注意到。

用户回答回答于

我用GC.Collect只有在编写粗糙的性能/分析器测试平台时,才需要测试两个(或更多)代码块--类似于:

GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
TestA(); // may allocate lots of transient objects
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
TestB(); // may allocate lots of transient objects
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
...

使TestA()TestB()以尽可能相似的状态运行。TestB()不会因为TestA离临界点很近。

一个典型的例子是一个简单的控制台exe(Main方法排序--足够在这里发布),它显示了环字符串连接和StringBuilder.

扫码关注云+社区