我读过很多关于C#的书,但这个问题总是让我困惑。我所理解的是,C#是托管代码,所有垃圾回收都是在CLR决定何时运行垃圾回收时发生的。我们开始吧。
假设我有一个简单的类
Student
:public class Student
{
public int IdStudent { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
}
class Program
{
static void Main(string[] args)
{
This is row1: Person person = new Person() {IdPerson=1, Name="Bill", SurName="Collins"};
This is row2: System.GC.Collect();
This is row3: string str="Hello World!";
}
}
请审批或拒绝我的假设:
- 我对于垃圾回收不会立即在row2运行的说法正确吗?
GC.Collect()
只是一个请求,用于触发垃圾回收,但并不会立即在row2处运行。该行的执行可能需要x毫秒/秒。在我看来,方法System.GC.Collect();
只是告诉垃圾收集器应该运行垃圾回收,但真正的垃圾回收可能需要x毫秒/秒才会发生只有垃圾收集器知道何时运行垃圾回收。如果第二行:
row2: System.GC.Collect();
中的Generation 0有足够的空间,则垃圾回收将不会发生。由于我们是在托管环境下编程,因此无法立即运行垃圾回收,只有CLR决定何时运行垃圾回收。垃圾回收可以在x毫秒/秒内运行,也可能因为在调用
GC.Collect()
方法后,Generation 0有足够的空间来创建新对象而不运行垃圾回收。程序员所能做的就是通过方法GC.Collect()
请求CLR运行垃圾回收。
更新:
我已经阅读了这篇关于GC.Collect Method ()
的msdn文章。然而,对于未引用对象的真正清除何时开始仍然不清楚。MSDN说:
GC.Collect Method () 强制立即回收所有代的垃圾。
然而,在备注中,我读到了这个:
使用此方法尝试回收所有不可访问的内存。它执行所有代的阻塞垃圾回收。
- 我被这个"使用此方法尝试"所困惑,我认为垃圾回收可能不会发生,因为CLR决定有足够的空间来创建新对象。我是正确的吗?
GC.Collect()
,那么你做错了什么。 - Damien_The_UnbelieverGC.Collect
,那么你会破坏一些东西。只需...别这么做。此外,在调试器中运行时,person
在你的GC.Collect
点被认为未引用。 - Luaan