【问题标题】:An Example of forced GC gone bad?强制 GC 变坏的例子?
【发布时间】:2012-07-23 19:52:58
【问题描述】:

我正在做一个关于 .Net CLR GC 的介绍性演示,并拥有所有不同的部分,但我想要一个具体的示例,说明尝试强制收集如何可能是危险或有害的。我知道你可以过早地将事情强加给更高的世代,但是(据我所知)这只会减慢速度。

我正在尝试考虑一种情况,即强制 GC 可能会造成真正的破坏,而我不断想出一些效率较低的解决方案。

【问题讨论】:

  • 浪费时间是唯一的缺点。
  • “强制收集”我假设您的意思是调用 GC.Collect()。为什么你会认为那会很危险?是否有一些我错过的文档是这样说的? (我意识到这种可能性很高,因为这些天我跟不上。)
  • 很想知道如果并行运行 GC.Collect() 会发生什么。
  • @Dialectus 内存使用率也很高,因为对象会过早地被提升为寿命更长的世代,导致它们更长时间地抵抗收集。
  • @JTA “Any public static members of this type are thread safe.” 我相信整个框架中的所有public static 成员都是如此。

标签: .net garbage-collection clr


【解决方案1】:

这是一个有趣的演示。请注意,您应该运行在发布模式下编译的这个演示,否则它可能无法像宣传的那样工作。

版本 1:

private void Button_Click(object sender, EventArgs e)
{
    Timer timer = new Timer(Print, null, 0, 1000);
}

private void Print(Object o)
{
    if (textBox1.InvokeRequired)
    {
        Action<object> action = Print;
        textBox1.Invoke(action, o);
        return;
    }

    textBox1.Text = DateTime.Now.ToString();
}

版本 1 会愉快地将日期和时间每秒打印一次到文本框。

版本 2:

private void Button_Click(object sender, EventArgs e)
{
    Timer timer = new Timer(Print, null, 0, 1000);
}

private void Print(Object o)
{
    if (textBox1.InvokeRequired)
    {
        Action<object> action = Print;
        textBox1.Invoke(action, o);
        return;
    }

    textBox1.Text = DateTime.Now.ToString();

    GC.Collect(); // force a garbage collection
}

现在在版本 2 中,日期和时间将只打印一次,因为在声明之后,没有更多对计时器对象的引用,因此计时器对象被收集。

这是一个相当人为的例子,但可能是一个很好的演示。

我必须将这本书归功于杰弗里·里希特 - 在他的优秀著作中 CLR via C#。

【讨论】:

  • 我相信如果你只是调用new Timer(...并且没有保存返回值,这种行为会更加出乎意料。
  • 但在这种情况下,GC.Collect() 还不错,实际上很好,因为它可以帮助您发现应用程序中的错误。如果没有GC.Collect(),它会在未来一段时间内神秘地停止工作。
  • @svick - 好点。也许这只是范围界定的一个更好的教训。无论如何,这很有趣,让人想到 GC。
【解决方案2】:

下面这个坏主意呢? “让我们在 ASP.NET 中的每个 HTTP 请求之后强制进行 GC,以清理肯定会成为孤立的请求状态!”

这是个坏主意,因为并发 HTTP 请求会相互干扰。这会引入大量延迟峰值并破坏性能。所有这一切都从单纯的“优化”开始。

这是我能想到的最糟糕的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    相关资源
    最近更新 更多