Java.lang.OutOfMemoryError en Android 5.0, causado por una asignación de 16k cuando 5M está disponible

He recibido el siguiente informe de error extraño para mi aplicación para Android de Google Play (anote la cantidad de asignación en función del espacio libre disponible)

java.lang.OutOfMemoryError: Failed to allocate a 16396 byte allocation with 5746272 free bytes and 111MB until OOM at com.android.internal.util.FastXmlSerializer.<init>(FastXmlSerializer.java:55) at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:183) at android.app.SharedPreferencesImpl.writeToFile(SharedPreferencesImpl.java:597) at android.app.SharedPreferencesImpl.access$800(SharedPreferencesImpl.java:51) at android.app.SharedPreferencesImpl$2.run(SharedPreferencesImpl.java:512) at android.app.SharedPreferencesImpl.enqueueDiskWrite(SharedPreferencesImpl.java:533) at android.app.SharedPreferencesImpl.access$100(SharedPreferencesImpl.java:51) at android.app.SharedPreferencesImpl$EditorImpl.commit(SharedPreferencesImpl.java:455) at com.headuck.headuckblocker.bj.a(Unknown Source) at com.headuck.headuckblocker.UpdateService.e(Unknown Source) at com.headuck.headuckblocker.UpdateService.a(Unknown Source) at xaonHandleIntent(Unknown Source) at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.os.HandlerThread.run(HandlerThread.java:61) 

Soy consciente de una serie de preguntas OutOfMemoryError en SO, pero parece que ninguno de ellos es causado por la asignación de bytes mucho menor que el espacio libre disponible.

El usuario estaba usando un Galaxy S5 en Android 5.0, e informó que tales accidentes ocurren mientras juegan juegos (y qué juegos no importa) – lo cual creo que esto se repite cada vez que él / ella está usando otra aplicación intensiva de memoria en primer plano y la El servicio de fondo de mi aplicación está programado para ejecutarse. Al ser un informe de Google Play, no dispongo de otros medios para obtener más detalles.

Mi pregunta es, lo que posiblemente podría hacer que esto suceda, y cualquier medida que una aplicación podría tomar para evitarlo?

Algunos antecedentes (en caso de que esto sea relevante): el bloqueo anterior proviene de un servicio de fondo programado periódicamente de mi aplicación, que no implica ninguna interfaz de usuario / mapa de bits. Todo lo que hace es descargar datos desde el servidor y actualizar la base de datos / estado. Se ejecutó sin ningún problema en máquinas de 5 años de edad con mucho menos memoria RAM, y debe ser muy ligero en la memoria por los estándares de los modernos teléfonos Android. La instancia de error anterior ocurre en un punto después de la actualización de la base de datos y el servicio está escribiendo estado actualizado a la preferencia compartida.

Edit: acaba de leer OutOfMemoryError en Android en la asignación de 4Mb cuando 10Mb es gratuito, que estaba vinculado a esta pregunta después de la publicación, pero sólo parece bastante improbable que el espacio libre disponible puede ser tan fragmentado en este caso? ¿Hay alguna otra causa posible?

Si está usando Android Studio, agregue "LargeHeap = true" en su archivo de manifiesto.

Me gusta esto;

Android: largeHeap = "true"

Me he enfrentado a un problema similar. Esto es lo que hice para solucionarlo

  1. Crear una nueva carpeta drawable-nodpi en su res / carpeta
  2. Mover todas las "imágenes" en la carpeta / drawable a la carpeta / drawable-nodpi

Espero que esto ayude a alguien 🙂

  • ¿Cómo puedo comprobar si una aplicación se ejecuta en Android?
  • Android Análisis de señal y algunos filtros
  • Manejo de cambios de orientación condicionalmente
  • Cómo importar proyecto java existente en android studio?
  • No se puede verificar la llamada de método de simulación desde el suscriptor de RxJava
  • Cola sin bloqueo de solicitudes HTTP POST con persistencia
  • Cómo evitar objetos duplicados en la base de datos DB4o
  • Cómo guardar 2 cadenas en una aplicación para Android?
  • Android simular pulsaciones de teclas
  • ¿Es más eficiente para convertir la cadena a Int o Int a la cadena al comprobar la igualdad?
  • Android StackScrollLayout
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.