.net – 循环引用原因内存泄漏?

我试图运行在Windows窗体应用程序中的内存泄漏。我现在在看一个包含几个嵌入表单的表单。我担心的是,孩子的形式,在他们的构造函数中,引用父表单,并将其保存在一个私人成员字段。所以在我看来,垃圾收集时间:

父对象通过控件集合引用子表单(子表单嵌入其中)。子窗体不是GC’d。

子表单通过私有成员字段引用父表单。父表单不是GC’d。

这是对垃圾收集器如何评估情况的准确理解吗?任何方式来证明它的测试目的?

伟大的问题!

不,两种形式都将(可以)GC’d,因为GC不直接查找其他引用中的引用。它只查找所谓的“根”引用…这包括堆栈上的引用变量(变量在堆栈上,实际对象当然在堆上),引用CPU寄存器中的变量,以及引用变量类中的静态字段…

所有其他引用变量只有被访问(和GC’d),如果它们被引用在由上述过程找到的“根”引用对象之一的属性中…(或在根对象中的引用引用的对象中) ,等…)

所以只有当其中一个形式被引用在“根”引用中的其他地方 – 那么这两种形式都将是安全的。

只有一种方式,我可以想到“证明”它,(不使用内存跟踪实用程序)将创建几十万的这些形式,在一个方法中的循环,然后,在该方法中,查看应用程序的内存占用,然后退出该方法,调用GC,再次查看占位符。

http://stackoverflow.com/questions/400706/circular-references-cause-memory-leak

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:.net – 循环引用原因内存泄漏?