6

Durante la lettura di documenti Xamarin nella sezione "Performance", ho notato il seguente capitolo:Xamarin garbage collector e circolari riferimenti

Il seguente diagramma illustra un problema che può verificarsi con riferimenti forti:

Circular reference

L'oggetto A ha un forte riferimento all'oggetto B e l'oggetto B ha un forte riferimento all'oggetto A. Tali oggetti sono noti come oggetti immortali a causa della presenza del cir riferimenti forti cular. Questa relazione genitore-figlio non è insolita e, di conseguenza, nessuno dei due oggetti può essere reclamato dal garbage collector, anche se gli oggetti non sono più in uso dall'applicazione.

Questa è la prima volta che ho sentito parlare di "oggetti immortali" nel contesto C# /. NET/Mono.

La pagina continua quindi con un suggerimento per utilizzare uno WeakReference in uno degli oggetti, che rimuoverà il riferimento circolare e risolverà questo "problema".

Allo stesso tempo, documenti Xamarin su garbage collection affermazione che:

Xamarin.Android usa Mono di Simple Generational garbage collector. Questo è un garbage collector mark-and-sweep [...]

I GC non sono contrassegnati e trascinati da riferimenti circolari?

risposta

8

Le perdite di memoria a causa di riferimenti circolari si applicano solo a Xamarin.iOS, che utilizza il conteggio dei riferimenti per gli oggetti nativi.

La pagina sugli oggetti immortali anche says:

Boehm - Questo è un conservatore, non generazionale garbage collector. È il garbage collector predefinito utilizzato per le applicazioni Xamarin.iOS che utilizzano l'API classica.

La seconda citazione parla specificamente di Xamarin.Android.

+0

Grazie. Ho anche notato che è possibile abilitare SGen su iOS (c'è una casella di controllo da qualche parte nelle opzioni), ma è contrassegnato come "sperimentale". Qualcuno ha avuto esperienza con SGen su iOS in pratica e risolve questo problema? – Lou

+0

C'è un [Nuovo sistema di conteggio dei riferimenti] (https://developer.xamarin.com/guides/ios/advanced_topics/newrefcount/), Se ho capito bene, si propone di risolvere il problema opposto (oggetto raccolto troppo aggressivamente). È interessante notare che è un'opzione diversa da SGen/Boehm. Immagino che significhi che anche con SGen, l'oggetto iOS viene conteggiato con riferimento e che i riferimenti circolari dovrebbero essere evitati. – bwt