C#垃圾收集收集

时间:2018-06-12 07:51:17

标签: c# garbage-collection

所以我正在玩C#垃圾收集,我注意到一件非常奇怪的事情。

Random r = new Random();
byte inl = 0;
while(true)
{
    inl = (byte)r.Next(0, 255);
    Console.WriteLine(inl);
    GC.Collect(0, GCCollectionMode.Forced, false, false);
}

我在主循环中有这个代码。没有GC.Collect函数,程序运行大约10MB的RAM。 但是使用GC.Collect函数,它运行时带有6MB RAM。

然后我的问题出现了,为什么GC在写入控制台后没有自动删除?

1 个答案:

答案 0 :(得分:2)

有不同的方法可以清理不同语言/框架中未使用的内存。

在C ++中你有(例如)引用计数的智能指针,当它们的计数达到零时会自动调用指针上的删除。如果这是您在.NET世界中所期待的行为,那么您会感到失望! :)

.NET GC模型非常不同。为了避免担心手动管理内存,CLR负责跟踪正在使用的引用,并根据需要清理内存。但是,监视和检查正在使用哪些引用是一个相对昂贵的过程。因此垃圾收集器不会连续运行。例如,当存在内存压力时(在其他情况下,这当然是一种简化),它就会开始。

简短的回答基本上是:让垃圾收集器完成它的工作。它是一个非常智能且高度优化的系统,您很少(如果有的话)必须自己手动触发垃圾收集。