2012-09-18 11 views
10

Quindi una delle sfide su Android sono le varie specifiche del dispositivo (in particolare la memoria del dispositivo).Determinazione della memoria disponibile su Android

Ho scritto i miei oggetti modello per utilizzare in modo estensivo Java SoftReferences in modo lazy load, quindi la VM è libera di tagliare parti del modello di dati attualmente non utilizzate come ritengono opportuno e vengono semplicemente ricostituite secondo necessità.

Tuttavia, una sfida nella pratica con SoftReferences è che tendono a essere cancellati in pochi secondi di riferimento debolmente in contrapposizione alla sospensione finché la VM non ha memoria ridotta, quindi funzionano bene in termini di consentire il modello per tagliare, ma non funzionano bene in quanto spesso significa che nulla è in memoria. Idealmente su un dispositivo con un sacco di memoria, si consentirebbe all'utente di mantenere gli oggetti in memoria.

Come risultato, è comune combinare SoftReferences con un meccanismo LRU, in cui l'LRU mantiene un puntatore rigido agli oggetti di riferimento recenti. Questo ovviamente non è l'ideale dato che presuppone di avere abbastanza memoria per tutti questi oggetti appena citati.

Inoltre, è una sfida sapere quale è un buon valore predefinito per LRU.

In un mondo perfetto, Android potrebbe usare è a basso richiamata la memoria come un suggerimento (così mi potrebbe iniziare con un piccolo LRU, e periodicamente aumentarlo fino callback di memoria insufficiente iniziato che si verificano poi di nuovo fuori per trovare un buon valore per un dispositivo), ma nella mia esperienza questa richiamata non sembra mai coincidere con la pressione effettiva della memoria VM.

Qualcuno si è imbattuto in un modo ragionevole per rilevare che il modello di dati utilizza troppa memoria su un particolare dispositivo?

+1

Il conteggio 'OutOfMemoryException' conta? https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html il 'memClass' usato potrebbe essere un modo per (staticamente) ridimensionare il tuo modello. – zapl

+0

Penso che quando OutOfMemoryErrors inizia a essere lanciato tu sei fondamentalmente un hosed. Ma grazie per il link all'articolo. –

risposta

0

Questo lavoro dovrebbe funzionare?

MemoryInfo mi = new MemoryInfo(); 
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
activityManager.getMemoryInfo(mi); 
long availableMegs = mi.availMem/1048576L; 
0

se si utilizza Android NDK:

#include <unistd.h> 

size_t getTotalSystemMemory() 
{ 
    long pages = sysconf(_SC_PHYS_PAGES); 
    long page_size = sysconf(_SC_PAGE_SIZE); 
    return pages * page_size; 
} 

size_t getFreeSystemMemory() 
{ 
    long pages = sysconf(_SC_AVPHYS_PAGES); 
    long page_size = sysconf(_SC_PAGE_SIZE); 
    return pages * page_size; 
} 

1

se si desidera determinare la memoria disponibile in Android, allora si può controllare o andare in prospettiva -> DDMS 2) la seconda cosa è che è possibile utilizzare gli strumenti dell'analizzatore di memoria controllati nella memoria usata e non utilizzata, si controlla anche la disponibilità di memoria .

Problemi correlati