2011-10-01 11 views
11

Ho appena dato un'occhiata al video google io "gestione della memoria per Android". Le diapositive sono disponibili qui http://dubroy.com/memory_management_for_android_apps.pdf. L'esempio perdita di memoria è in slitta 36.Esempio di perdita di memoria Android da Google I/O

Non capisco perché questo causa una perdita dopo il cambio di orientamento. Capisco che la fuga è una classe interiore e ha un riferimento alla classe esterna. Inoltre, capisco che la variabile statica "leak" rimanda all'oggetto "Leaky" ... tutta l'attività. Penso che sia speciale a causa della parola chiave statica. Le variabili statiche hanno una certa memoria e probabilmente non sono gc (almeno finché dura l'applicazione)?!?

Bene, cosa succede in caso di modifica dell'originale? Viene creata una nuova istanza di attività e vengono chiamate le attività onCreate. leak == null è falso. La perdita indica ancora l'attività "vecchia". Questa è una perdita. La vecchia attività non può essere, giusto?

Perché l'utilizzo della memoria aumenta con ogni modifica dell'originale? Nella mia (errata) comprensione suppongo che solo la prima attività non possa essere gc'ed. Le altre attività che vengono create a causa del cambiamento di oriantazione possono essere fatte in gc perché non sono referenziate da quella variabile statica "leak".

Tuttavia ... ovviamente ... Ho completamente sbagliato!

+0

Era utile? Un'accettazione sarebbe carina :) –

+0

Penso che tu pensi che l'attività distruzione == garbage collection. Ho aggiunto una risposta che tenta di spiegare cosa sta succedendo. Fondamentalmente, è perché la perdita fa == null nell'attività appena creata. Perchè, leggi la mia risposta. – iheanyi

risposta

2

Una spiegazione classica della perdita di memoria contestuale modifica dell'orientamento da Google blog. Tu eri la maggior parte del modo lì, penso, notando il riferimento statico dell'interno alla classe esterna.

+0

Sì, l'ho letto prima. In realtà è lo stesso e l'autore dice "perde la prima attività". Questo è il comportamento che ho descritto sopra. Mi è chiaro che le prime perdite di attività. Ma solo il primo. Le modifiche di Oriantation dopo questo non dovrebbero influire o aumentare l'heap e non dovrebbero verificarsi più perdite. Ma nel video che ho postato l'heap sembra aumentare con ogni modifica di inizio (inizia al minuto 28) da 9mb a 12 a 15mb. Bene, ho intenzione di testare questo a breve – 207

+0

La mia comprensione è che ogni volta che cambi orientamento perdi l'attività ma non ottieni GCd. Quando ritorni di nuovo a Portrait passando a Landscape, non ottieni il tuo contesto iniziale. –

+0

Sì, non si ottiene il contesto iniziale. Ma perché ogni volta?La variabile statica fa riferimento solo alla prima attività – 207

1

Non capisci perché hai commesso un errore critico. leak == null è vero nell'attività appena creata. perdita non punta ancora alla "vecchia" attività.

Perché? Pensavo che la perdita fosse statica. Bene. . .

Quindi, prima volta, viene creata l'attività, perdita è nullo, quindi onCreate() e perdite ora fa riferimento a un oggetto che perde. Se creo più istanze di quell'attività, le loro perdite non saranno nulle e faranno riferimento allo stesso oggetto.

Tuttavia, ciò che accade quando capovolgi l'orientamento è che l'attività viene distrutta. Quindi, non esiste un'istanza di un oggetto attività. Android crea quindi una nuova attività, in cui la perdita è nullo (poiché per quanto riguarda Android non esiste un'altra istanza dell'attività).

Tuttavia, al collettore spazzatura, qualcuno fa mantenere un riferimento all'attività distrutta, cioè la sua classe Leaky interna. Quindi non libererà quel ricordo. Quindi, mentre continui a cambiare orientamento, continui a perdere attività degne di memoria.