【问题标题】:C# Garbage Collection CollectC# 垃圾收集收集
【发布时间】:2018-06-12 07:51:17
【问题描述】:

所以我在玩 C# Garbage Collection 时发现了一件很奇怪的事情。

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没有在变量写入控制台后自动删除?

【问题讨论】:

  • 确实如此......只是不是在适合你的时候,而是在心情好的时候
  • 你永远不知道 GC 何时真正开始清理
  • 请注意,您看到的内存可能是Console.WriteLine() 分配的一些缓冲区。 Random 不分配变量,inl 在堆栈中。
  • 垃圾收集的整个想法是它通常不是确定性的,但它会在某个时候发生。触发器可能是经过的时间量、使用的一定数量的内存或其他东西。在您的示例中,您正在强制收集立即运行,而不是等待垃圾收集自行发生。

标签: c# garbage-collection


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 2011-01-21
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2012-05-04
    • 1970-01-01
    相关资源
    最近更新 更多