2015-07-30 25 views
11

Sto lavorando a un'app che gestisce molte allocazioni (dell'ordine di 4 milioni di doppi e un milione di classi). Stavo controllando i registri di Garbage Collector e ho visto che diverse quantità di memoria venivano liberate su dispositivi diversi.Android Garbage Collector Freed Memory

Ad esempio, ho un Moto X (2014) che finisce per liberare poco più di 312 MB. Ho anche un Droid Bionic che esegue lo stesso codice sugli stessi dati che libera in media 616 MB. Entrambi i dispositivi hanno una dimensione heap di circa 50 MB.

Perché è tanto più memoria liberata dal GC sul Bionic che dal Moto X? Dovrebbero generare la stessa quantità di spazzatura ciascuno. Cosa succede dietro le quinte del netturbino? Il Moto X è su Android 5.1 e Bionic è acceso 4.1.2.

Modifica: ho quattro dispositivi che liberano circa 300 MB di RAM: il Moto X (2014), il Nexus 7 2013, il Nexus 7 2012 e il Razr i. Tutti e quattro di questi usano ART. Il Bionic sta eseguendo il runtime Dalvik. È per questo che c'è meno liberazione? Ho notato che GC_FOR_ALLOC non si verifica in ART ma viene sempre chiamato su Dalvik.

+0

Penso che la differenza sia dovuta alle architetture del processore utilizzate. MotoX utilizza Qualcomm Snapdragon S4 (set di istruzioni ARMv7), Bionix ha utilizzato un Cortex A-A53 più aggiornato (set di istruzioni ARMv8). –

+0

@ShreyasChavan è la Moto X 2014 quindi ha uno Snapdragon 801 e il Bionic (dal 2011) ha un TI OMAP Cortex-A9 –

+2

Le architetture del processore sono irrilevanti. L'heap di Dalvik e GC sono stati sviluppati attivamente fino alla metà del 2011, quando tutto è passato allo sviluppo dell'Arte. Probabilmente stai vedendo la differenza che anni di sviluppo possono fare. Conosco molto poco delle interiora dell'Arte, quindi non posso offrire approfondimenti specifici. Farò notare che osservare i messaggi di registro è un confronto tra mele e arance e che la mancanza di registrazione in stile Dalvik su un dispositivo Art non significa che non siano in corso azioni equivalenti. – fadden

risposta

2

Citando this postale:

Successivamente, il team ART ha lavorato per ottimizzare il garbage collector (GC). Invece di due pause per un totale di circa 10ms per ciascun GC in Dalvik, ne vedrai solo uno, di solito sotto i 2 ms. Inoltre, hanno parallelizzato le porzioni di delle esecuzioni del GC e le strategie di raccolta ottimizzate per essere al corrente degli stati del dispositivo . Ad esempio, un GC completo verrà eseguito solo quando il telefono è bloccato e la capacità di risposta dell'utente non è più importante . Si tratta di un enorme miglioramento per le applicazioni sensibili ai frame interrotti .

Ciò che l'autore dice qui è che i dispositivi alimentati ARTE sarà molto più efficace nel contesto di GC - sia per quanto riguarda il tempo GC "Rifiuti" e la quantità di memoria liberata in fase di esecuzione.

Contributo per l'utilizzo della memoria inferiore può essere attribuito a questo (questa è solo una supposizione):

In forse il miglioramento più importante, ART ora compila il tuo applicazione in codice macchina nativo quando installato su il dispositivo di un utente. Conosciuto come compilazione in anticipo, è possibile prevedere grandi guadagni in termini di prestazioni dello mentre i compilatori sono ottimizzati per specifiche architetture (come ARM, x86 o MIPS). Ciò elimina la necessità di per la compilazione just-in-time ogni volta che viene eseguita un'applicazione. Pertanto richiederà meno tempo per l'installazione, ma all'avvio verrà avviata più rapidamente poiché molte attività eseguite in runtime su Dalvik VM, come la verifica della classe e del metodo, hanno già avuto luogo.

Poiché ART compila la tua app in anticipo, il tempo di compilazione può essere esteso, consentendo al compilatore di eseguire un lavoro migliore ottimizzando il codice.