Java 不朽的物体真的存在吗?

Java 不朽的物体真的存在吗?,java,c#,android,xamarin,garbage-collection,Java,C#,Android,Xamarin,Garbage Collection,在本文中: 它表示,如果两个对象相互强引用,它们将成为iPortal,这意味着即使应用程序不再使用这些对象,GC也无法收集它们。 但是,在这两个SO讨论中: 似乎只要应用程序不再使用对象,循环引用就可以由GC处理 我理解错了吗?Java的GC在Android上的表现是否不同?我真的很困惑。 如有任何意见,敬请告知。谢谢 从您的问题中,我不确定您关心什么语言或环境,但在Java中,没有您描述的那种“不朽对象”。Java垃圾收集不基于引用计数:它基于根的可达性。由于您的两个对象没有被应用程序中的

在本文中: 它表示,如果两个对象相互强引用,它们将成为iPortal,这意味着即使应用程序不再使用这些对象,GC也无法收集它们。

但是,在这两个SO讨论中:

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

我理解错了吗?Java的GC在Android上的表现是否不同?我真的很困惑。
如有任何意见,敬请告知。谢谢

从您的问题中,我不确定您关心什么语言或环境,但在Java中,没有您描述的那种“不朽对象”。Java垃圾收集不基于引用计数:它基于根的可达性。由于您的两个对象没有被应用程序中的任何其他地方引用,因此它们有资格进行垃圾收集。

Xamarin,它本质上是一个(现在)独立于.NET的实现。和.NET一样,它将垃圾收集基于可达性,而不是引用计数或存在性。(Java GC系统也是如此,但因为Xamarin不是基于Java的,所以这不是重点。)

两个相互引用但在程序中无法访问的对象可以进行垃圾收集。不需要使用弱引用来解决该场景,因为一旦“根”引用无法访问两个对象,就会收集对象


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

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

  • 在Java和C世界中,循环引用都不是问题。GC 我能处理得很好。因此,对于Xamarin Android来说 这篇文章毫不相干,具有误导性。但是,该文章列在跨平台下
  • 在Obj-C或Swift世界中,他们使用引用计数。和循环 引用确实会导致内存泄漏。所以在Xamarin.IOS中我们需要
    小心点更新:感谢PeterDuniho的评论,准确地说,对于Xamarin.IOS,托管世界由Mono管理,我们不必担心圆圈。但如果两个本机对象相互引用,它们将成为不朽的。。。如果你想了解Android垃圾收集器,为什么要链接到MS.Net上的两个讨论?你在问什么?或对于Android,。那篇文章对我来说显然是不正确的,.NET GC总是作为一个跟踪GC来实现的,据我所知,@Asik同样适用于Java。这篇文章似乎假设GC是基于引用计数的,而Java和.NET的情况并非如此。@ElliottFrisch,我之所以链接两个dot-NET讨论,是因为这篇文章来自微软的子公司Xamarin,它使我们能够在Android和IOS上使用dot-NET。“所以在Xamarin.IOS中,我们需要小心。”--如果您在Xamarin下运行的托管代码直接使用iOS内存分配器,您可能会。但事实并非如此。Xamarin是托管代码和操作系统之间的一层;您的代码使用的是Mono内存管理系统,因此纯托管对象的行为与其他平台上的行为相同。iOS内存系统发挥作用的唯一地方是当您使用或扩展本机/对等对象时,托管引用本身并不影响这一点(当然,您总是需要处理一次性对象,就像在正常的.NET代码中一样)。