6

Podczas czytania docs Xamarin w sekcji "Performance", zauważyłem następujący rozdział:Xamarin śmieciarza i okrągłe referencje

Poniższy diagram ilustruje problem, który może wystąpić z silnymi odniesieniami:

Circular reference

Obiekt A ma silne odniesienie do obiektu B, a obiekt B ma silne odniesienie do obiektu A. Obiekty takie są znane jako nieśmiertelnych obiektów ze względu na obecność silne referencje. Ta relacja rodzic-dziecko nie jest niczym niezwykłym, w wyniku czego żaden obiekt nie może zostać odzyskany przez moduł czyszczenia pamięci, nawet jeśli obiekty nie są już używane przez aplikację.

Po raz pierwszy usłyszałem o "nieśmiertelnych obiektach" w kontekście C#/.NET/Mono.

Strona następnie kontynuuje sugestię użycia WeakReference w jednym z obiektów, który usunie silne odwołanie kołowe i naprawi ten "problem".

Jednocześnie, Xamarin Docs na garbage collection zastrzeżeniu, że:

Xamarin.Android używa Mono Simple Generational garbage collector. To jest śmieciarz z oznaczaniem i zamiataniem [...]

Czy oznaczenie i zamiatanie GC nie ma wpływu na odwołania kołowe?

Odpowiedz

8

Wycieki pamięci z powodu odniesień kołowych dotyczą tylko Xamarin.iOS, które wykorzystują liczenie odwołań dla obiektów natywnych.

strona o nieśmiertelnych obiektów również says:

Boehm - To jest konserwatywny, non-pokoleniowej garbage collector. To to domyślny garbage collector używany do aplikacji Xamarin.iOS , które używają klasycznego API.

Drugi cytat w szczególności mówi o Xamarin.Android.

+0

Dzięki. Zauważyłem też, że można włączyć SGen na iOS (gdzieś w opcjach jest pole wyboru), ale jest oznaczone jako "eksperymentalne". Czy w praktyce ktoś miał doświadczenie z SGen na iOS i czy rozwiązuje ten problem? – Lou

+0

Istnieje [Nowy system liczenia odwołań] (https://developer.xamarin.com/guides/ios/advanced_topics/newrefcount/), Jeśli dobrze rozumiem, ma to na celu rozwiązanie przeciwnego problemu (obiekt zebrany zbyt agresywnie). Co ciekawe jest to inna opcja niż SGen/Boehm. Sądzę, że oznacza to, że nawet przy SGEN, obiekt iOS jest zliczany jako odniesienie i należy unikać odniesień kołowych. – bwt