Xamarin 垃圾回收器和循环引用

7
在阅读Xamarin文档的"性能", 我注意到以下章节:

下面的图表说明了强引用可能出现的问题:

Circular reference

对象A对对象B有一个强引用,对象B对对象A也有一个强引用。由于存在循环强引用,这些对象被称为不可释放的对象。这种父子关系并不罕见,因此即使应用程序不再使用这些对象,垃圾回收器也无法回收这些对象。

这是我第一次在C#/.NET/Mono的上下文中听到“不可释放的对象”。
该页面随后继续建议在其中一个对象中使用WeakReference,这将删除强循环引用并解决此“问题”。
同时,Xamarin文档中关于垃圾回收的内容声称:

Xamarin.Android使用Mono的Simple Generational garbage collector。这是一个标记-清除垃圾回收器[...]

标记-清除垃圾回收器不受循环引用的影响吗?
1个回答

9
由于循环引用而导致的内存泄漏仅适用于采用本地对象引用计数的Xamarin.iOS。
关于不死对象的页面还提到:“使用SGen垃圾回收器”

Boehm - 这是一种保守的、非代际垃圾收集器。它是用于使用Classic API的Xamarin.iOS应用程序的默认垃圾收集器。

第二个引用特别涉及到Xamarin.Android。

谢谢。我还注意到iOS上可以启用SGen(选项中有一个复选框),但被标记为“实验性”。有没有人在实践中使用SGen,它是否解决了这个问题? - Lou
有一个新的引用计数系统,如果我理解正确,它旨在解决相反的问题(对象被过度收集)。有趣的是,这是与SGen / Boehm不同的选项。我猜这意味着即使使用SGen,iOS对象也是有引用计数的,并且应该避免循环引用。 - bwt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接