.net – 使用GC.Collect()有什么错误?

虽然我明白了使用这个函数的严重影响(或者至少这是我的想法),我不明白为什么它成为这些事情之一,可敬的程序员不会使用,即使是那些甚至不知道它是什么。

让我们说,我正在开发一个应用程序,内存使用情况变化很大,取决于用户在做什么。应用程序生命周期可以分为两个主要阶段:编辑和实时处理。在编辑阶段,假设创建了数十亿甚至数万亿的对象;一些是小的,一些不是,一些可能有终结剂,一些可能不,并且假设他们的寿命从几毫秒到长时间变化。接下来,用户决定切换到实时阶段。在这一点上,假设性能起着根本的作用,并且程序流量中的轻微改变可能带来灾难性的后果。然后,通过使用对象池和类似的,然后GC意外地将对象创建减少到尽可能最小,并且抛弃它,并且有人死亡。

问题:在这种情况下,在进入第二阶段之前调用GC.Collect()是否明智?

毕竟,这两个阶段从来没有在时间上彼此重叠,并且GC可能收集的所有优化和统计信息在这里没有什么用处。

注意:正如你们中的一些人所指出的,.NET可能不是这种应用程序的最佳平台,但这超出了这个问题的范围。目的是澄清GC.Collect()调用是否可以提高应用程序的整体行为/性能。我们都同意,在这种情况下,你会做这样的事情是非常罕见的,但然后再次,GC试图猜测,并在大多数时间做得很好,但它仍然是猜测。

谢谢。

From Rico’s Blog…

Rule #1

Don’t.

This is really the most important
rule. It’s fair to say that most
usages of GC.Collect() are a bad idea
and I went into that in some detail in
the orginal posting so I won’t repeat
all that here. So let’s move on to…

Rule #2

Consider calling GC.Collect() if some
non-recurring event has just happened
and this event is highly likely to
have caused a lot of old objects to
die.

A classic example of this is if you’re
writing a client application and you
display a very large and complicated
form that has a lot of data associated
with it. Your user has just
interacted with this form potentially
creating some large objects… things
like XML documents, or a large DataSet
or two. When the form closes these
objects are dead and so GC.Collect()
will reclaim the memory associated
with them…

所以听起来这种情况可能会落在规则2下,你知道有一个时刻,许多旧对象已经死亡,它是非经常性的。但是,不要忘了理光的分词。

Rule #1 should trump Rule #2 without
strong evidence.

测量,测量,测量。

http://stackoverflow.com/questions/118633/whats-so-wrong-about-using-gc-collect

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:.net – 使用GC.Collect()有什么错误?