强制GC变坏的例子?

时间:2012-07-23 19:52:59

标签: .net garbage-collection clr

我正在.Net CLR GC上做介绍,并且有各种各样的部分,但我想要一个例子,特别是如何强制收集可能是危险或有害的。我知道你可以过早地将事情强加给更高代人,但是(从我能说的话)这实际上只会减慢事情。

我正在考虑一种强迫GC可能真正具有破坏性的情况,而且我一直只是效率低下的解决方案。

2 个答案:

答案 0 :(得分:4)

这是一个有趣的演示。请注意,您应该运行在发布模式下编译的此演示版,否则它可能无法正常播放。

版本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中,日期和时间只会被打印一次,因为在声明之后,不再有对定时器对象的引用,因此会收集计时器对象。

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

我必须相信杰弗里·里希特(Jeffery Richter)这本书 - 这是他出色的书CLR via C#

答案 1 :(得分:1)

以下是什么坏主意? “让我们在ASP.NET中的每个HTTP请求之后强制执行GC,以便清理肯定会成为孤儿的请求状态!”

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

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