我正在修复大型项目中的内存泄漏,因此我将其缩小为一个Main()方法,其中Obj1包含对另一个引用类型对象的引用的引用类型对象Obj2.然后,我创建另一个类型的对象,Obj1其中包含对同一Obj2对象的引用.两个对象都使用块,如下所示:
using (dynamic obj1_a = new Obj1(args))
{
do some actions...
using (dynamic obj1_b = new Obj1(args))
{
do some more actions...
//Memory Snapshot 1 taken here
}
}
GC.Collect();
GC.WaitForPendingFinalizer();
GC.Collect();
//Memory Snapshot 2 taken here
Run Code Online (Sandbox Code Playgroud)
不知怎的,当我坐2个快照在上述评论的要点并加以比较,.NET内存探查表明,即使两个对象obj1_a和obj1_b已安置,他们没有被GC'ed.当我检查参考图时,我看到内存分析器说两个对象都是由我的Main()方法本身引用的.我已经完成了Main()方法的整个代码(它不是很复杂,只是创建,稍微修改然后测试垃圾收集),看看是否有一个变量引用仍然存在于这两个对象但是没有.我的Main()方法怎么可能将这些对象保存在内存中?重要的是他们收集垃圾(或者至少能够获得GC),因为它们包含对更多参考和值类型的引用,并且程序在没有它的情况下变得相当大.