【发布时间】:2015-09-01 17:37:10
【问题描述】:
我是 ASP.Net 的新手。
我想强制运行垃圾收集器,但我不明白如何运行垃圾收集器。
【问题讨论】:
标签: asp.net garbage-collection
我是 ASP.Net 的新手。
我想强制运行垃圾收集器,但我不明白如何运行垃圾收集器。
【问题讨论】:
标签: asp.net garbage-collection
在显着减少的情况下使用
GC.Collect方法 在应用程序的特定点使用的内存量 代码。例如,如果您的应用程序使用一个复杂的对话框 有几个控件,对话框关闭时调用Collect 可以通过立即回收所使用的内存来提高性能 对话框。确保您的应用程序不会产生垃圾 收集过于频繁,因为如果 垃圾收集器正在尝试以非最佳状态回收对象 次。
这称为诱导垃圾收集。
您可以在Forced模式或Optimized模式下调用Collect。
使用此方法的多个重载,您可以选择删除所有代的对象或特定代的对象。
通常情况下,您可以通过巧妙地将短期对象包装在 using 块中来避免需要调用 GC 的情况
【讨论】:
你可以试试System.GC.Collect()。也看看MSDN。但请注意,手动触发 GC 的需要通常表明存在错误/糟糕的设计。
【讨论】:
回答你的问题。
GC.Collect();
GC.WaitForPendingFinalizers();
您不必强行调用 GC collect,因为它应该在内存紧张时自动执行。
有些人在午夜没有很多用户时在服务器中执行完整的垃圾收集。争论是,GC.Collect 可以在垃圾收集过程中暂停一些线程,当对用户的影响较小时,清除所有不需要的内存会更好一些。但是,我的意见是,除非您有任何特定的内存问题,否则您不需要它。
【讨论】:
我目前的理解是,在尝试执行此操作时,您最终可能会过于频繁地意外调用垃圾收集器,从而导致您意想不到的后果。原因是因为在 ASP.Net 请求的生命周期中,调用垃圾收集器的唯一合乎逻辑的地方是在请求结束时,但是一个站点每秒可以有数百个请求,因此您的站点无法很好地扩展因为它会一直在收集垃圾。作为开发人员,您的下一个想法可能是为其创建后台作业,但这是 ASP.Net 中的一个高级且有争议的话题,此外,GC 本身已经在它自己的更高效的后台作业中运行。
您想要做的是确保在请求结束时对任何对象调用 Dispose(),或者如果您确定已完成它们,则更早(可能很难知道您是否'已经完成了。一个对象的生命有时需要比你意识到的更长,比如你不想过早处理它的 EF 数据上下文,以便让它稍后在请求中提供模型关系的延迟加载生命周期)。
此规则的一个例外可能是,如果有某种类型的请求不经常运行(例如管理员启动了一些消耗大量内存的操作)并且您也无法像平常一样处理它.在这种情况下,使用提到的 GC.Collect 可能会很好,但使用 DhruvJoshi 引用的文档尝试将其称为“非阻塞”并使用内存分析器来确定您可以收集的最低代号。
【讨论】: