.net - 在什么情况下,我们需要两次调用GC.Collect

标签 .net garbage-collection

我们有一个基于Unity和MMVVVM模式的WPF应用程序。在应用程序生命周期中,可以有多个项目生命周期,在每个项目生命周期之后,我们都进行了手动拆解,并尝试释放ViewModel的所有引用。对于Unity的事件订阅,我们使用的是弱引用。因此,我们假设拆解后可以调用GC Collect,以便所有垃圾对象都被垃圾回收。我们还有一个手动取消所有事件订阅的选项,但是我们更喜欢垃圾回收,因为它将为我们清除大约200MB的空间,这将有助于新项目的加载。

在一个实例中,我们观察到,如果我只调用一次GC.Collect,它的引用仍然会在内存中保留一段时间。

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

但是,如果我尝试连续两次调用GC,它将很好地清理所有内容。
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();

任何想法或指针将不胜感激。

更新:

在类中没有定义终结器。

现在,我也在考虑一种情况,在另一个可能具有终结器的对象中引用此对象。在我们的框架中,我们只为DBProvider提供终结器,所以我不认为,即使是这种情况。

最佳答案

基本上,您听起来像带有终结器的东西-如果只调用一次GC.Collect(),终结器将完成,但不会收集终结的对象。

那是否代表错误是另一回事。通常,确实需要执行终结器并不是一个好主意,但是对于您而言,这没关系。

关于.net - 在什么情况下,我们需要两次调用GC.Collect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3829928/

相关文章:

.net - Process.ExitTime "Process was not started by this object, so requested information cannot be determined."上的 InvalidOperationException 是什么意思

c# - Visual Studio 2012 - 代码覆盖率 - 如何正确执行?

Java 主要和次要垃圾收集

javascript - 如何删除 Javascript 中的所有对象引用?

.net - 异步调用与多线程

c# - 我的 C# Entity Frameworks 项目闹鬼了吗?

c# - C#/.NET 中文件级别的函数作用域?

garbage-collection - 计数器是否垃圾收集?

python - 哪些类型的 Python 对象是用引用初始化的,哪些不是?

java - XA 事务结束、垃圾收集和直到 tx-complete =true