2010-01-25 22 views
15

Me aparece el error "El tamaño de mapa de bits excede el presupuesto de VM". He leído que hay un límite de memoria de 16 MB. In this thread Romain Guy dice que "solo se pueden asignar 16 MB de memoria para toda la aplicación".Asignación de memoria de Android

Sin embargo, mi aplicación debe estar quedándose sin memoria mucho antes de que llegue a ese límite. Entonces mi pregunta es: ¿cómo asigno la memoria a mi aplicación ... cómo puedo aumentar la asignación a mi aplicación (dentro de los 16MB máximo)?

+24

bien 640KB deberían ser suficientes para todo lo que google sea generoso ... – Gu1234

Respuesta

36

Al igual que con cualquier máquina virtual Java, la memoria dinámica crecerá automáticamente al tamaño máximo. Pero, los mapas de bits se asignan fuera de la máquina virtual, por lo que no los "ves" fácilmente en las estadísticas. Lo mejor que puede hacer es asegurarse de que no utiliza mapas de bits grandes, o escalar hacia abajo usando
http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html

De Eclipse se puede generar un volcado de pila cuando se está en Android 1.6 o hacia arriba y se puede analizar la volcar con Eclipse MAT.

Generalmente no puede controlar el tamaño máximo de almacenamiento dinámico en un dispositivo real, a menos que trabaje con hardware o firmware personalizados.

Debe haber un artículo en developer.android.com sobre volcar el montón en 1.6, pero no puedo encontrarlo. :(

Editar
Además, tengo que mencionar que se puede pedir más memoria para aplicaciones mediante el uso de

androide: largeHeap = "true"

en el manifiesto. Pero esto está muy mal asesorado ya que la mayoría de las aplicaciones no lo necesitan.

+0

Gracias. Echaré un vistazo a los vertederos y MAT cuando tenga tiempo. – prepbgg

+1

Acabo de notar que dijiste que podría obtener un volcado de pila y usar Eclipse MAT en Android 1.6. Desafortunadamente, mi dispositivo está en 1.5 así que eso es para lo que estoy programando. ¿Hay alguna manera fácil de obtener un análisis de memoria para 1.5? La tabla de uso de memoria en SysInfo en DDMS incluye un pequeño incremento en el uso en cada rotación de pantalla; ¿Incluye la memoria que no es de montón usada por bitmaps? El Rastreador de asignación DDMS no muestra ningún uso significativo de memoria (suponiendo que sus unidades son bytes); ¿Hay algún otro objeto además de mapas de bits que no aparezca en el RMS Allocation Tracker? – prepbgg

+1

Puede ejecutar su código en el emulador 1.6 para la depuración, o puede probar el procedimiento descrito aquí http://biowallet.blogspot.com/2009/04/analyze-android-15-memory-dump.html o puede utilice la API en http://developer.android.com/reference/android/os/Debug.html#dumpHprofData%28java.lang.String%29 para volcar el montón desde su aplicación a la ubicación que desee. – botteaap

11

Tenga en cuenta que el límite del montón depende del dispositivo. En un Droid o Nexus One, tha t límite es 24 MB (para acomodar los recursos gráficos más grandes).

+0

Nexus S también tiene 24 MB, parece que los dispositivos de gama más alta tendrán más de 16 MB pero si desea ejecutarlo en cualquier dispositivo, debe mantenerlo por debajo de los 16 MB. – ddcruver

+8

No, Nexus S tiene 32 MB en 2.3. –

+1

¿Cómo puedo saber el límite del montón de mi dispositivo? –

6

Si está utilizando subprocesos, entonces el depurador podría ser el origen del problema. Si ejecuta la aplicación debajo del depurador, el depurador conservará los subprocesos creados, incluso cuando terminen de ejecutarse. Esto genera errores de memoria que no se producirán cuando la aplicación se esté ejecutando sin el depurador.

http://code.google.com/p/android/issues/detail?id=7979

https://android.googlesource.com/platform/dalvik/+/master/docs/debugger.html

+0

Gracias por esto. Me pregunté si usar el depurador podría causar problemas de memoria que de otro modo podrían no ocurrir. Es bueno tenerlo confirmado. – prepbgg

+1

Supongo que esto es lo contrario de un heisenbug ... – snapfractalpop

-1

he encontrado la respuesta a su pregunta recientemente.

Ir a Android SDK y Directorio
ejecución de gestión de SDK (Herramientas> ejecutar Android este archivo)

En el Gestor de SDK vaya a Herramientas -> Administrar AVDs

cuadro de diálogo Administrador de dispositivos virtual Ahora Android Esta abierto..

en esa ventana seleccione su AVD y haga clic en Editar

Ahora en la sección de tarjetas SD seleccione un tamaño y el 1024 MiB en la sección de hardware, haga clic en Nuevo y seleccione la propiedad "máxima VM aplicación Tamaño del montón" Ahora SET 100 (basado de sus necesidades de aplicaciones) por último, haga clic en "Editar AVD"

Después botón de actualización de edición, haga clic en Administrador de SDK

Ahora ejecutar su aplicación en AVD el problema está resuelto.

+3

Esto solo funciona para el emulador, no para un dispositivo real. – botteaap

+0

... y tiene muy poco (casi nada) que ver con la memoria disponible para su aplicación y la reducción de memoria que utilizan los mapas de bits. – Ewoks