我们可以强制垃圾收集器在ASP.net中运行吗?

时间:2015-09-01 17:37:11

标签: asp.net garbage-collection

我是ASP.Net的新手。

我想强行运行垃圾收集器,但我不明白如何运行垃圾收集器。

4 个答案:

答案 0 :(得分:1)

引自MSDN article

  

当显着减少时使用GC.Collect方法   在应用程序的特定点使用的内存量   码。例如,如果您的应用程序使用复杂的对话框   有几个控件,在关闭对话框时调用Collect   可以通过立即回收使用的内存来提高性能   对话框。确保您的应用程序不会引起垃圾   收集太频繁,因为如果这会降低性能   垃圾收集器试图以非最佳方式回收对象   次。

这称为诱导垃圾收集。 您可以Collect模式或Forced模式拨打Optimized

使用此方法的多次重载,您可以选择删除所有对象或特定的对象生成。

通常情况下,当您需要调用GC时,可以通过在using块中明智地包装短期对象来避免这种情况

答案 1 :(得分:0)

你可以尝试例如System.GC.Collect()。另请查看MSDN。但要注意,手动触发GC的需要通常表明存在错误/不良设计。

答案 2 :(得分:0)

Answer for your question.

GC.Collect();
GC.WaitForPendingFinalizers();

You don't have to call GC collect forcefully because it is supposed to be executed automatically when there is a memory stress.

Some executes full garbage collection in the server at mid night when there are no many users around. The argument is that, GC.Collect can pause some threads during the garbage collection process and it would be little better to clear all unwanted memory when there is less impact to the user. However, my opinion is, you don't need that unless you have any specific memory issue.

答案 3 :(得分:0)

我目前的理解是,在尝试执行此操作时,您很可能最终会意外地过于频繁地调用垃圾收集器,从而导致意想不到的后果。原因是因为在ASP.Net请求的生命周期中,调用垃圾收集器的唯一逻辑位置是请求的末尾,但是一个站点每秒可以有数百个请求,因此您的站点无法很好地扩展因为它一直都是垃圾收集。作为开发人员,您的下一个想法可能是为此做后台工作,但这是ASP.Net中一个高级且值得商topic的话题,此外,GC本身已经在自己的更高效后台工作中运行。

您要执行的操作是确保在请求结束时对任何对象调用Dispose(),或者如果您确定已对它们完成操作,则更早地调用它(可能很难知道是否已对象的寿命有时需要比您意识到的要长,例如,对于EF数据上下文,您不想过早处置它,以便让它在请求的稍后阶段为模型的关系提供延迟加载生命周期)。

该规则的一个例外可能是,如果有某种类型的请求不经常运行(例如,管理员启动了消耗大量内存的操作),并且您也无法像平常一样处理它。在那种情况下,使用提到的GC.Collect可能会很好,但是请使用参考的DhruvJoshi文档尝试将其称为“非阻塞”,并使用内存探查器确定您可以收集的最低发电代数。