【发布时间】:2015-04-22 18:21:48
【问题描述】:
我已经在 C#/WPF 应用程序上工作了一段时间,我已经到了我认为我的一些对象没有像我期望的那样被垃圾收集的地步。
我是如何做出这个决定的?
我在希望被垃圾回收的类中添加了带有断点的终结器。我运行我的应用程序并触发一系列事件,这些事件将 a)创建对象,然后 b)导致对象被谴责(理论上)。例如,我打开一个对话框然后关闭它等等。我的终结器没有被调用。
只是为了更加确定 GC 不会花费过长的时间,或者对象以某种方式被提升到老一代,因此没有以相同的速度被收集,我什至创建了一个定期强制垃圾收集的线程,即:
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
仍然没有命中终结器断点。在这一点上,我相当确定有一些参考阻止了这些对象被收集,但我无法确定是什么。
所以我的问题有两个:
- 根据我的测试,我的结果是否有效?
- 如果是这样,是否有一些 我可以用来确定对象引用的机制或工具 (即对象引用链的可视化表示)?
提前致谢!
【问题讨论】:
-
也许析构函数没有运行,因为不需要内存。垃圾收集器决定何时需要释放内存。
-
您是否尝试过在 Visual Studio 中使用内存分析器?我认为它适用于您的项目类型。
-
内存分析器向我显示分配和使用情况,但我需要找出谁持有对特定对象的引用。我可以看到探查器对于确定性能很有用,但我似乎无法获得我正在寻找的详细信息(我不否认我可能缺乏关于如何有效使用探查器工具的知识......)
-
不要尝试在调试器中验证这一点 - 它可以延长对象的生命周期。运行 RElase 版本并使用日志记录。
-
贴出相关代码(大纲)。到目前为止,您还没有证明这里有任何问题。
标签: c# garbage-collection