2010-09-29 12 views
7

Tengo aquí una aplicación que tiene la función de mostrar un PDI en el mapa. Es solo un PDI y solo se dibuja cuando está realmente dentro del área de la pantalla visible. Funciona perfectamente por un tiempo, pero si juego zumbando dentro y fuera y arrastrando, finalmente se bloqueará. Según Logcat, la razón siempre es un error de OutOfMemory.Error de memoria insuficiente al utilizar la API de Google Maps

Al principio, pensé que era un error en la API de Google Maps. Después de investigar y ver algunas publicaciones de Romain Guy, estaba convencido de que había hecho algo estúpido en mi aplicación que me hacía perder la memoria de vez en cuando. Luego ejecuté algunas pruebas más detalladas con Heap Analyzer (Eclipse) y vi que a pesar de que tenía 2+, a veces 3+ megabytes de memoria libre, todavía recibía esos molestos mensajes de Force Close causados ​​por OutOfMemoryError. La mayoría de las veces se bloquea al intentar asignar un trozo de 614kb de memoria, independientemente de cuánto me queda.

Este problema ocurre mucho en Nexus One 2.2.1 y en HTC Evo 2.1. Después de algunas pequeñas pruebas, no tuve ningún accidente ni en G1 1.6 ni Samsung Galaxy S i9000 2.1. Pero no puedo decir con certeza que el G1 y Galaxy no mostrarán este problema después de más pruebas.

Solo puedo pensar en un problema de fragmentación de la memoria. Espero que este problema tenga una solución. También me alegrará si puedo detectar este error y evitar que la aplicación se cuelgue.

Si ayuda, aquí está el Logcat:

09-29 08:58:06.661: ERROR/dalvikvm-heap(1552): 648000-byte external allocation too large for this process. 
09-29 08:58:06.661: ERROR/dalvikvm(1552): Out of memory: Heap Size=9991KB, Allocated=6980KB, Bitmap Size=14510KB 
09-29 08:58:06.661: ERROR/(1552): VM won't let us allocate 648000 bytes 
09-29 08:58:06.672: DEBUG/AndroidRuntime(1552): Shutting down VM 
09-29 08:58:06.672: WARN/dalvikvm(1552): threadid=3: thread exiting with uncaught exception (group=0x4001b390) 
09-29 08:58:06.672: ERROR/AndroidRuntime(1552): Uncaught handler: thread main exiting due to uncaught exception 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at android.graphics.Bitmap.nativeCreate(Native Method) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at android.graphics.Bitmap.createBitmap(Bitmap.java:569) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at com.google.android.maps.ZoomHelper.createSnapshot(ZoomHelper.java:422) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at com.google.android.maps.ZoomHelper.beginZoom(ZoomHelper.java:186) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at com.google.android.maps.MapView$2.onScaleBegin(MapView.java:371) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at android.view.ScaleGestureDetector.onTouchEvent(ScaleGestureDetector.java:208) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at com.google.android.maps.MapView.onTouchEvent(MapView.java:646) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at android.view.View.dispatchTouchEvent(View.java:3709) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:874) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1701) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1116) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at android.app.Activity.dispatchTouchEvent(Activity.java:2068) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1685) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1708) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at android.os.Looper.loop(Looper.java:123) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at android.app.ActivityThread.main(ActivityThread.java:4595) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at java.lang.reflect.Method.invoke(Method.java:521) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
09-29 08:58:06.681: ERROR/AndroidRuntime(1552):  at dalvik.system.NativeStart.main(Native Method) 
+0

Recibí los mismos informes de error de mis usuarios que tienen la versión 1.5, 2.1 y 2.2 del sistema operativo. Stacktrace no pasa por mi código, así que no puedo detectar este error: la aplicación termina con FC. – tomash

+0

Realmente parece un problema de fragmentación.Es como si mi aplicación tuviera alguna pérdida de memoria que propagara pequeños trozos de datos por toda mi área de memoria de montón. Supongo que este tipo de comportamiento podría mejorarse en las próximas versiones de Dalvik porque puede no ser un error, pero seguro que no es un "buen comportamiento", ya que en realidad tiene memoria pero el sistema no puede usarla debido a su fragmentación. Bueno, seguiré intentando ver qué se puede hacer al respecto. –

+0

Sé que ha pasado más de un año desde que se hizo esta pregunta, pero ¿se ha desarrollado una solución para este problema? Soy curioso. ¡Gracias por adelantado! – Ahmed

Respuesta

1

He estado corriendo en este problema de forma intermitente durante el mes pasado. La forma en que he solucionado el problema en mi código es forzando al GC a limpiar mapas de bits sin referencia que he incluido en WeakReferences. Es posible que este enfoque no funcione para usted, ya que el bloqueo que pegó arriba parece originarse en MapView. Independientemente, intente rociar algunas llamadas System.gc() en las ubicaciones clave en su código y mire el registro del sistema para ver si los mensajes GC_EXPLICIT indican una gran cantidad de objetos/bytes liberados. En el código en el que estoy trabajando, he tenido que agregar un System.gc() al final de mi método Adapter.getView() para garantizar que los mapas de bits no utilizados se limpien la próxima vez que se llame a getView(). Este enfoque parece haber reducido drásticamente mi ejecución con el temido java.lang.OutOfMemoryError: el tamaño del mapa de bits excede el bloqueo del presupuesto de VM.

+0

llamando a System.gc() no debería estar ayudando a OOME. la VM no pasará por OOME antes de intentar ejecutar el GC en sí. también, System.gc() no hace nada para la fragmentación. –

+0

Estos errores OOME tienden a ocurrir con mayor frecuencia en teléfonos de la familia Galaxy como: Nexus One y Nexus S. No usé tanto el Galaxy Nexus para comprobar si este problema también ocurre más en este teléfono en comparación con los demás. Lanzar llamadas GC para limpiar la memoria junto con la codificación cuidadosa es, hasta donde yo sé, la mejor manera de evitar este problema. También se puede atrapar la excepción (como Throwable) y al menos evitar que la aplicación se cierre a la fuerza. Pero desafortunadamente, no estoy seguro de si hay una solución definitiva para este problema ... –

1

He tenido este mismo problema EXACTO, he salado el código con algunas llamadas System.GC y me pareció ayudar un poco, pero esto todavía sucede.

También estoy recibiendo otro problema que podría estar relacionado con el hecho de que el mapa parece voltearse e ir al azar cuando pellizcas el zoom. Esto tiende a suceder a veces antes de un choque.

Todo esto solo ocurre en un HTC Desire que creo que es el mismo teléfono que el Nexus One bajo el capó. (y similar en muchos sentidos al EVO que también sufre de esto).

Nota: Funciona 100% bien en nuestro Arc-S, Galaxy V1, emulador AVD y tableta Asus.

1

he tenido el mismo problema, agregue la siguiente línea en el archivo de manifiesto en virtud de la aplicación de etiquetas

androide: largeHeap = true. Esto funcionó para mí

+0

mejora la tasa de accidentes pero no resuelve el problema por completo. –

+0

Esto es básicamente una solución de respaldo si absolutamente nada funciona en absoluto. –

Cuestiones relacionadas