6

При чтении Xamarin документов в разделе "Performance", я заметил следующую главу:Xamarin сборщика мусора и циклические ссылки

Следующая диаграмма иллюстрирует проблему, которая может возникнуть при сильных ссылках:

Circular reference

Объект A имеет сильную ссылку на объект B, а объект B имеет сильную ссылку на объект A. Такие объекты известны как бессмертные объекты из-за присутствия cir сильные ссылки. Это отношение родитель-ребенок не является необычным, и в результате ни один объект не может быть восстановлен сборщиком мусора, даже если объекты больше не используются приложением.

Это первый раз, когда я слышал об «бессмертных объектах» в контексте C# /. NET/Mono.

Затем страница продолжает предлагать использовать WeakReference в одном из объектов, который удалит сильную круговую ссылку и устранит эту проблему.

В то же время, Xamarin документы по garbage collection утверждают, что:

Xamarin.Android использует Моно Simple Generational garbage collector. Это сборщик мусора маркировки и разметки [...]

Не являются ли маркеры и развертки GC незатронутыми циркулярными ссылками?

ответ

8

Утечки памяти из-за круговых ссылок применяются только к Xamarin.iOS, которые используют подсчет ссылок для собственных объектов.

страница о бессмертных объектов также says:

Бем - Это консервативный, не поколениях сборщик мусора. Он является сборщиком мусора по умолчанию, используемым для приложений Xamarin.iOS , которые используют классический API.

Вторая цитата конкретно говорит о Xamarin.Android.

+0

Спасибо. Я также заметил, что можно включить SGen в iOS (есть флажок где-то в настройках), но он отмечен как «экспериментальный». Имел ли кто-нибудь опыт работы с SGen на iOS на практике и исправляет ли он эту проблему? – Lou

+0

Существует [Новая система подсчета ссылок] (https://developer.xamarin.com/guides/ios/advanced_topics/newrefcount/). Если я правильно понимаю, она направлена ​​на решение противоположной задачи (объект слишком агрессивно). Интересно, что это другой вариант, чем SGen/Boehm. Я предполагаю, что это означает, что даже с SGen объект iOS подсчитывается по ссылке, и следует избегать циклических ссылок. – bwt

 Смежные вопросы

  • Нет связанных вопросов^_^