C# 双对象内存泄漏?

C# 双对象内存泄漏?,c#,java,android,memory-leaks,C#,Java,Android,Memory Leaks,以下是c#程序的设置: 主类内部:ObjA MyObjA=new ObjA() ObjA内部:ObjB MyObjB=new ObjB() main引用了ObjA,ObjA引用了ObjB 现在让我们假设在主类中,我设置MyObjA=null垃圾收集器会出现并销毁ObjA吗?或者它会保存它,因为它引用了ObjB(尚未销毁) 您可以看到,在后一种情况下,这将是一个巨大的内存泄漏。但作为旁注,如果前一种情况是真的,那么在ObjB被销毁之前,GC会经过1次还是2次 还有,有人能告诉我Android Ja

以下是c#程序的设置:

主类内部:
ObjA MyObjA=new ObjA()

ObjA内部:
ObjB MyObjB=new ObjB()

main引用了ObjA,ObjA引用了ObjB

现在让我们假设在主类中,我设置
MyObjA=null垃圾收集器会出现并销毁ObjA吗?或者它会保存它,因为它引用了ObjB(尚未销毁)

您可以看到,在后一种情况下,这将是一个巨大的内存泄漏。但作为旁注,如果前一种情况是真的,那么在ObjB被销毁之前,GC会经过1次还是2次


还有,有人能告诉我Android Java也会发生什么吗?这是我正在使用的两种atm语言。

MyObjA和MyObjB都将被销毁,因为它们无法从任何GC根访问(比如静态变量、堆栈变量,或者像这样的东西递归指向的东西)


我不太清楚你说的两次传球是什么意思。Java垃圾收集器的细节有些复杂,但是如果对象不可访问,则应在单个GC循环中清除它们。

您不能设置
ObjA=null
。您只能将指向ObjA的指针改为指向null:
MyObjA=null
。Android和/或Java甚至没有循环引用的问题,因为垃圾收集不是基于简单的引用计数(例如,计数有多少个对象引用了我,计数为0后的可用内存),就像它在中一样。@KeithPayne thanx,是个打字错误,我把它编辑成我想要的meant@zapl好的,那么GC如何确定要销毁谁呢?顺便说一句,我的例子也不是循环引用。这实际上是一个引用链,我想问的是,如果你将一个链接设置为null,那么链中的其他所有内容是否都会被破坏(在一个GC过程或多个GC过程中)?我不知道它是如何详细工作的(并且至少可以为Oracle JVM配置3或4个不同的GC算法),但是GC从“GC根”开始(调用引用系统类的系统类加载器,然后系统类加载器引用其他对象)并遍历层次结构,直到从该层次结构中可以访问的所有内容都标记为“已引用”,并且可以删除任何其他内容(如果删除未在
finalize
中重新创建引用).在Android上,算法可能略有不同,但它使用相同的模式。2次通过,就像第一次ObjA被破坏一样,然后在下一次通过时,它意识到没有任何东西指向ObjB,所以它在第二次左右被破坏……还有,我是如何获得对你的帖子的编辑访问权限的!?@user1705043:简单地说,标记和扫描会发生什么GC将从GC根遍历,标记它认为可以访问的所有内容。然后它会注意到MyObjA和MyObjB没有到达并清理它们。因此,只需运行一次垃圾收集器。@user1705043:我想你刚刚提出了一个编辑建议。看起来你需要2000点来进行完全编辑:。这真是奇怪,因为我单击了编辑,我得到了你所有的文字的整个盒子;我想我已经把它全部抹掉了,但没有理由燃烧或不健康,不像我知道的其他论坛……顺便说一句,编辑按钮仍然在你的帖子下面,所以如果你像我一样好奇,那么让我知道,这样我可以尝试抹掉你的帖子lol