我正在.Net CLR GC上做介绍,并且有各种各样的部分,但我想要一个例子,特别是如何强制收集可能是危险或有害的。我知道你可以过早地将事情强加给更高代人,但是(从我能说的话)这实际上只会减慢事情。
我正在考虑一种强迫GC可能真正具有破坏性的情况,而且我一直只是效率低下的解决方案。
答案 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请求会相互干扰。这会引入大量延迟峰值并破坏性能。所有这些都是从无辜的“优化”开始的。
这是我能想到的最糟糕的事情。