C#中垃圾回收是什么时候被触发的?

13

我读了很多关于垃圾收集的内容,比如它的代、作用域等,但我想知道什么时候会触发垃圾收集?如果可能的话,请提供一个示例。

谢谢。


3
我没有足够的积分,@MikeNakis :) - Nikolay Kostov
4
了解“为什么”你想知道会很有帮助。当垃圾回收器感觉到是时候进行垃圾回收时,它就会进行回收;它的内部策略不是文档化和保证行为的一部分。如果你只是好奇,那就是另一回事。如果你打算开发依赖于特定GC策略的软件,那么你正在冒着相当大的风险。 - Eric Lippert
3
最近在面试中我被问到了这个问题,所以想知道@EricLippert的看法。 - user3265575
3个回答

17

垃圾回收会在以下情况下发生:

  • 系统的物理内存较低。
  • 托管堆中分配对象占用的内存超过可接受的阈值。该阈值在进程运行时不断调整。
  • 调用GC.Collect方法。在几乎所有情况下,您都不需要调用此方法,因为垃圾回收器会持续运行。此方法主要用于特殊情况和测试。

来源:垃圾回收基础 - 垃圾回收的条件


2
那么...clr在程序中定期检查物理内存,如果低于一定阈值,则触发垃圾回收吗? - user3265575
1
很可能是的。如果微软表示当系统内存不足时会调用GC,那么CLR应该被通知或检查内存是否不足。 - Nikolay Kostov

1
  1. 当应用程序无法从托管堆中获取内存时,自动触发
  2. 当给定的AppDomain从内存中卸载时,自动触发
  3. 通过代码调用GC.Collect()时手动触发

0
你无法控制 GC 并且不能可靠地预测其行为。 所有调用,例如GC.Collect,都是向VM发送的简单消息以启动收集,但这并不意味着收集将在该行之后立即开始。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接