Pasé 4 días completos intentando todo lo posible para descubrir la pérdida de memoria en una aplicación que estoy desarrollando, pero las cosas dejaron de tener sentido hace mucho tiempo.
La aplicación que estoy desarrollando es de naturaleza social, así que piense en Actividades de perfil (P) y enumere Actividades con datos, por ejemplo, insignias (B). Puede saltar de un perfil a una lista de insignias, a otros perfiles, a otras listas, etc.
Así que imagina un flujo como este P1 -> B1 -> P2 -> B2 -> P3 -> B3, etc. Por coherencia, estoy cargando perfiles e insignias del mismo usuario, por lo que cada página P es igual y también lo es cada página B
La esencia general del problema es: después de navegar un poco, dependiendo del tamaño de cada página, obtengo una excepción de memoria insuficiente en lugares aleatorios (mapas de bits, cadenas, etc.), no parece ser coherente.
Después de hacer todo lo imaginable para averiguar por qué me estoy quedando sin memoria, no he encontrado nada. Lo que no entiendo es por qué Android no está matando P1, B1, etc. si se queda sin memoria al cargarse y, en cambio, se bloquea. Esperaría que estas actividades anteriores mueran y resuciten si alguna vez vuelvo a ellas a través de onCreate () y onRestoreInstanceState ().
Y mucho menos esto, incluso si hago P1 -> B1 -> Atrás -> B1 -> Atrás -> B1, todavía tengo un bloqueo. Esto indica algún tipo de pérdida de memoria, sin embargo, incluso después de descargar hprof y usar MAT y JProfiler, no puedo identificarlo.
Deshabilité la carga de imágenes desde la web (y aumenté los datos de prueba cargados para compensarlo y hacer que la prueba sea justa) y me aseguré de que la caché de imágenes usa SoftReferences. Android en realidad intenta liberar las pocas SoftReferences que tiene, pero justo antes de que se quede sin memoria.
Las páginas de insignias obtienen datos de la web, los cargan en una matriz de EntityData desde un BaseAdapter y los envían a ListView (en realidad estoy usando el excelente MergeAdapter de CommonsWare , pero en esta actividad de Insignias, en realidad solo hay 1 adaptador de todos modos, pero yo quería mencionar este hecho de cualquier manera).
Revisé el código y no pude encontrar nada que pudiera filtrarse. Borré y anulé todo lo que pude encontrar e incluso System.gc () a la izquierda y a la derecha, pero la aplicación aún se bloquea.
Todavía no entiendo por qué las actividades inactivas que están en la pila no se cosechan, y realmente me encantaría averiguarlo.
En este punto, estoy buscando sugerencias, consejos, soluciones ... cualquier cosa que pueda ayudar.
Gracias.
outOfMemory
error. ¡Gracias!