Pau*_*ell 5 .net c# garbage-collection
我正在寻找一个托管/非托管API,它将允许我找到哪些对象引用另一个对象,并可能防止它被垃圾收集.
这样的API可能如下所示:
var foo = new Foo();
var bar = new Bar();
bar.Foo = foo;
var references = GC.GetReferencesTo(foo);
// references is an array that contains bar
Run Code Online (Sandbox Code Playgroud)
我知道可以使用分析器,但我想将它作为单元测试的一部分.我可以使用托管或非托管API吗?
非托管dll SOS(Son Of Strike)提供了实现这一目标的方法,虽然我不相信它具有重要的脚本支持,也没有提供通过单个命令实现这一目的的简单方法.你必须反省变量的地址,检查变量的所有gcroots(显然包括堆栈)并处理余数.
我建议,如果你想证明一个对象没有被引用,一个更简单的技术是(暂时)使它可以完成,确保它不再被你的单元测试的堆栈引用然后通过强制几个垃圾收集GC.Collect()然后使用GC.WaitForPendingFinalizers().
你的finalize方法可以设置一个静态布尔标志,然后你的单元测试可以断言这是真的.
我会在没有进一步解释的情况下质疑其实用性,但这可能是证明单元测试中不存在悬空引用的最简单方法.