Java.lang.OutOfMemoryError: android.support.v4.app.BackStackState de longitud 1279544898 se desbordaría

Estos bloqueos se producen de forma intermitente, mientras que el respaldo de mi actividad principal, que consta de dos fragmentos (uno que es un fragmento de apoyo de Google Maps). Si no fuera por nuestro sistema de seguimiento de accidentes, no tendría idea de que los usuarios estuvieran experimentando esto, ya que no es reproducible en ninguno de mis dispositivos físicos o emulados. Se extiende varias API entre mi min de 15 y mi objetivo de 22.

En el sistema de choque, el accidente está ocurriendo en una de dos formas:

java.lang.OutOfMemoryError: android.support.v4.app.BackStackState[] of length 1279544898 would overflow 

o

 java.lang.OutOfMemoryError: Failed to allocate a 5118179604 byte allocation with 16777216 free bytes and 472MB until OOM near/at g.newArray:174 

El bloqueo se produce en el método onViewCreated del fragmento que contiene mi mapa:

 mMapView.onCreate(savedInstanceState); 

Mi primer pensamiento es la fuga de memoria, pero … parece que está en bucle al crear la backstack – como si el índice de backstacks ha desbordado el largo. Leak Canary no encontró fugas de memoria (excepto para nuestro MainApplication, que sé que mantiene una referencia estática al contexto). Y si se tratara de una fuga de memoria típica, parece extraño que este choque siempre ocurriría en la misma línea y en ningún otro lugar. Hay otras áreas de uso intensivo de memoria de esta aplicación (que es la empresa, por lo que no puedo divulgar demasiado), pero ninguna de esas otras actividades han arrojado errores OOM.

También debo señalar que se trata de una aplicación madura, con muchos usuarios y versiones. El problema OOM ocurre SOLAMENTE en la versión beta de nuestro lanzamiento actual (de nuevo, basado únicamente en los registros de nuestro sistema de seguimiento de fallos, ya que no podemos repro en cualquier parte). He hecho completas comparaciones de código entre nuestra versión de producción y nuestra versión beta, y la mayoría de los cambios son relativamente estándar / trivial. (No he empezado a agregar nuevos bitmaps ni nada.)

Las especificaciones:

  • Play Services 8.4.0
  • Gradle 2.1
  • API de destino 22
  • Min API 15
  • ProGuard habilitado

¿Alguien más está viendo esto? Puedo ver que el accidente está sucediendo, pero es terriblemente difícil de localizar cuando no puedo reproducirlo …

Respondiendo a mi propia pregunta …

Fui capaz de reproducir el error mediante activado No mantener actividades en las opciones de desarrollador.

Después de tres días de pruebas, finalmente descubrí que nuestro servidor de compilación estaba compilando soporte 24 en lugar del soporte 22 que he especificado en Gradle. Evidentemente hay alguna incompatibilidad entre el soporte 24 y los mapas de Android. Cambiando:

 compile 'com.android.support:support-v4:22.2.0' 

a

 compile('com.android.support:support-v4:22.2.0') { force = true } 

Forzando así a Gradle a tomar 22 en lugar de los 24 posteriores a su disposición, el backstack de bucle se fue. Ahora ya no veo el OOM con nuestros usuarios beta.

Yo especulo que tiene algo que ver con el cambio de modelo de permisos de API, pero quién sabe.

De todos modos … espero que esto ayude a alguien.

  • Comparar archivos heap dump (HPROF)
  • Bitmap, Bitmap.recycle (), WeakReferences y Garbage Collection
  • Interpretación de resultados MAT para la pérdida de memoria android
  • Informe Leakcanary de pérdida de memoria usando Otto
  • ¿Es esta una forma válida de mantener una referencia estática y Actividad / Contexto? ¿Por qué no debo hacer esto?
  • Android Weak Referencia de la clase interna
  • Clueless Acerca de (posible) pérdida de memoria de Android
  • MapView v2 manteniendo el contexto alrededor
  • ¿Cuáles son los beneficios de usar WeakReferences?
  • Reciclaje Bitmap no libera memoria
  • Fragmentos de Android en Backstack ocupan demasiada memoria
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.