Nuestra aplicación utiliza muchos mapas de bits. Funciona bien, por ejemplo, en G1, XOOM. Pero en HTC Desire hay un error de OutOfMemory. En el código usamos try/catch (OutOfMemoryError e) y todos los dispositivos (excepto Desire) lanzan una excepción, pero HTC simplemente mata la aplicación sin excepción OOM. Restringimos la memoria para mapas de bits a 12 Mb y parecía que esta solución solucionó el problema, pero el cliente todavía tiene problemas con el HTC Desire HD. Hay OOM incluso con una restricción de 12 Mb. Éstos son los registros de:Cómo saber cuánto tamaño de montón está disponible para mapa de bits para Android 2. *?
06-07 12:03:43.978 E/dalvikvm-heap(29616):1140128-byte external allocation too large for this process.
06-07 12:03:43.978 E/dalvikvm(29616):Out of memory: Heap Size=12311KB, Allocated=9420KB, Bitmap Size=12139KB, Limit=21884KB
06-07 12:03:43.978 E/dalvikvm(29616):Trim info: Footprint=15751KB, Allowed Footprint=15751KB, Trimmed=3440KB
06-07 12:03:43.978 E/GraphicsJNI(29616):VM won't let us allocate 1140128 bytes
AFAIK hay diferentes limitaciones de tamaño del montón de dispositivos (G1: 16mb, Droid: 24 mb, Xoom 48 mb). En mi opinión, el sistema debería dar al menos 16 mb, pero tenemos OOM con 12mb. Mi pregunta es: ¿cómo saber cuántos tamaños de almacenamiento dinámico disponibles para mapa de bits para Android 2. *? O, por favor, infórmese sobre cómo evitar dicho problema de otras maneras. FYI no podemos usar menos bitmaps, especialmente cuando funciona bien en otros dispositivos. ¡Gracias de antemano por cualquier ayuda!
Los mapas de bits AFAIK se asignan en el montón externo. No sé si esos métodos le darán información del montón "normal" y externo de una aplicación. Ver también: [esta publicación.] (Http://stackoverflow.com/questions/1945142/bitmaps-in-android) – icyerasor
De hecho están asignados en el montón nativo. Pero al menos para las versiones pre-Honeycomb de Bitmap, el código de bitmap nativo se asegura de reservar la misma cantidad de heap de Java (como una matriz) en caso de que los datos de píxel se soliciten desde el código de Java (a través de setPixel, getPixel, etc.). En ese caso, JNI copia los datos de píxeles nativos en el reino de Java, por lo tanto, también es necesario verificar el espacio de almacenamiento dinámico de Java disponible. – tiguchi