最近发现 ToGadget 中的变量,可能还有委托(delegate),没有被垃圾收集。谁能看出为什么 .NET 持有对此的引用?似乎在 Foo 结束后,委托(delegate)和所有对象都将被标记为垃圾收集。转储堆后,确实在内存中看到了数十亿。
注意:'result.Things' 是一个 List
public Blah Foo()
{
var result = new Blah();
result.Things = this.Things.ConvertAll((new Converter(ToGadget)));
return result;
}
.................
public static Gadget ToGadget(Widget w)
{
return new Gadget(w);
}
更新:将“ConvertAll”更改为此会清理委托(delegate)和相应的对象引用。这向我表明,要么 List<> ConvertAll 以某种方式保留委托(delegate),要么我不明白这些东西是如何被垃圾收集的。
foreach (var t in this.Things)
{
result.Things.Add(ToGadget(t));
}
最佳答案
使用内存分析器。
您可以整天在 StackOverflow 上提问并得到一堆有根据的猜测,或者您可以在您的应用程序上使用内存分析器并立即查看哪些是 root 的,哪些是垃圾。有一些可用的工具专门用于快速轻松地解决您的确切问题。使用它们!
关于c# - 委托(delegate)变量未被垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2106000/