Durante il ridimensionamento di bitmap di grandi dimensioni per il caricamento di immagini più veloce su un server, occasionalmente ho eseguito l'accesso a OutOfMemoryErrors. Per evitare ciò calcolo la quantità di memoria necessaria e controllo se supera Runtime.getRuntime(). MaxMemory() prima di provare a ridimensionare un'immagine.Heap non espandibile sull'emulatore Genymotion
Tuttavia, si verificano ancora errori OOM anche se l'immagine si adatta facilmente all'heap.
Il dispositivo emulato (Galaxy SII API 16) mi dà una memoria massima di 67108864 byte utilizzando il metodo precedente.
Nel seguente frammento, la dimensione heap è 43975 K e solo 15 K di quella memoria è in uso. Per la mia allocazione di ~ 31K, l'heap dovrebbe crescere automaticamente a circa 45K, che non è ancora vicino alla dimensione massima di 64 MiB. Ma come si può vedere, invece di espandere l'heap, dalvik vm esaurisce la memoria.
10-13 20:35:57.223: D/dalvikvm(1201): GC_FOR_ALLOC freed 505K, 67% free 14692K/43975K, paused 31ms, total 31ms
10-13 20:35:57.223: I/dalvikvm-heap(1201): Forcing collection of SoftReferences for 31961100-byte allocation
10-13 20:35:57.251: D/dalvikvm(1201): GC_BEFORE_OOM freed 2K, 67% free 14689K/43975K, paused 29ms, total 29ms
10-13 20:35:57.251: E/dalvikvm-heap(1201): Out of memory on a 31961100-byte allocation.
Mi chiedo se questo può accadere su un dispositivo reale o anche se questo potrebbe essere un bug genymotion.
L'heap è garantito per l'espansione fino a maxMemory()? JavaDoc per Runtime.getRuntime(). FreeMemory() dice che "può" espandersi, qualunque cosa significhi.
Ho solo bisogno di un modo realiable per calcolare la quantità di memoria che posso usare, questo è come ho fatto, per favore correggetemi se sbaglio:
long maxMemory = Runtime.getRuntime().maxMemory();
long usedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
long availableMemory = maxMemory - usedMemory;
Questa chiamata fa sì che l'OutOfMemoryError:
// outOptions has an appropriate inSampleSize
BitmapFactory.decodeStream(inputStream, null, outOptions);
Hai risolto questo problema? – KinGPinG
Purtroppo no. Qualche idea? – wkarl
No, mi dispiace mi sto ancora occupando di esso. Ti farò sapere se trovo qualcosa di utile. – KinGPinG