6

虽然根据第"Performance"读取Xamarin文档,我注意到的以下章节:Xamarin垃圾收集和循环引用

下图说明可与强引用会出现一个问题:

Circular reference

对象A对对象B有强烈的引用,而对象B对对象A有强烈的引用。这种对象被称为不朽对象由于存在cir强烈的参考。这种父子关系并不罕见,因此即使对象不再被应用程序使用,垃圾收集器也无法收回对象。

这是我第一次听说C#/ .NET/Mono上下文中的“不朽的对象”。

页面随后继续建议在其中一个对象中使用WeakReference,这将删除强循环引用并修复此“问题”。

Xamarin.Android使用Mono的Simple Generational garbage collector:上garbage collection声称

与此同时,Xamarin文档。这是一个标记和扫描垃圾回收器[...]

是否标记和扫描GC不受循环引用的影响?

回答

8

由于循环引用导致的内存泄漏仅适用于Xamarin.iOS,它使用本机对象的引用计数。

约不朽对象也says页:

伯姆 - 这是一个保守的,非代垃圾收集器。它是 是默认垃圾收集器,用于使用Classic API的Xamarin.iOS应用程序 。

第二个报价具体谈到Xamarin.Android。

+0

谢谢。我也注意到可以在iOS上启用SGen(在选项中有一个复选框),但它被标记为“实验性”。在实践中,有没有人有过使用iOS上的SGen的经验,并且是否解决了这个问题? – Lou

+0

有一个[新的参考计数系统](https://developer.xamarin.com/guides/ios/advanced_topics/newrefcount/),如果我理解正确,它的目的是解决相反的问题(对象收集太积极)。有趣的是,它与SGen/Boehm不同。我想这意味着即使使用SGen,iOS对象也被引用计数,并且应避免循环引用。 – bwt