Immortal Object真的存在吗?

时间:2016-04-28 16:19:02

标签: java c# android xamarin garbage-collection

在本文中:Xamarin - Use Weak References to Prevent Immortal Objects 它表示如果两个对象强相互引用,它们将变为imortal,这意味着GC无法收集它们,即使应用程序不再使用这些对象。

然而,在这两个SO讨论中:

Garbage collector and circular reference

Circular References Cause Memory Leak?

似乎循环引用可以由GC处理,只要应用程序不再使用这些对象。

我是否误解了什么? Java的GC在Android上的表现有所不同吗?我真的很困惑。 任何评论都是适用的。谢谢!

3 个答案:

答案 0 :(得分:2)

我不确定你的问题是什么语言或环境,但在Java中,没有"不朽的对象"你描述的那种Java垃圾收集不基于引用计数:它基于来自根的可达性。由于您的两个对象未被应用程序中的任何其他对象引用,因此它们符合垃圾回收条件。

答案 1 :(得分:2)

Xamarin is based on Mono,它本质上是(现在)独立的.NET实现。和.NET一样,它将垃圾收集基于可达性,而不是引用计数或存在。 (对于Java GC系统也是如此,但由于Xamarin不是基于Java,因此并不是真的。)

两个相互引用但在程序中无法访问的对象可以进行垃圾回收。没有必要使用弱引用来解决该场景,因为一旦" root"无法访问两个对象,就会收集对象。参考

换句话说,您正在查看的文章明显不正确。实际上,使用弱引用可能会导致其他问题,因为保持对象的活动变得更加复杂,从而更容易将错误编写到代码中。令我惊讶的是,这些错误的信息会出现在Xamarin网站上。

答案 2 :(得分:-1)

我做了一些研究,想回答我自己的问题。以下是一些调查结果:

  • 在Java和C#世界中,循环引用不是问题。 GC 可以很好地处理。因此,对于Xamarin Android来说 文章是无关紧要和误导的。但该文章列在跨平台......
  • 在Obj-C或Swift世界中,他们使用引用计数。和循环 引用确实会导致内存泄漏。所以在Xamarin.IOS我们需要 小心一点。 更新:感谢PeterDuniho的评论,准确地说,对于Xamarin.IOS来说,托管世界由Mono管理,我们不必担心圈子。但如果两个本土物体强烈互相引用,它们将成为不朽的......

我认为是这样的。链接有关此主题的一些参考文献: