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.
- ¿Cómo pasar Object ArrayList a través de la interfaz?
- Android Socket Programación?
- Llamar a diferentes constructores de Java de Scala con Android
- Error: 'SDL init falla, razón es: No hay dispositivo de vídeo disponible' al iniciar AVD
- Forzar una pantalla completa Actividad para volver a medir / volver a dibujar en el curriculum vitae?
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?
- Cómo cerrar un cuadro de diálogo en Android mediante programación?
- Android / Java: ¿Llamar a un método usando reflexión?
- ¿Cómo evento "first_open" en el conteo analítico de firebase?
- Android: activity_main no se puede resolver o no es un campo
- Acceda a config.properties desde AndroidManifest.xml
- Evitar / prevenir que un fragmento se refresque al cambiar las pestañas
- Biblioteca de Compatiblity de Android Proguard
- Cómo llamar a un servicio web SOAP en Android
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
- Crear una nueva carpeta drawable-nodpi en su res / carpeta
- Mover todas las "imágenes" en la carpeta / drawable a la carpeta / drawable-nodpi
Espero que esto ayude a alguien 🙂
- La creación de clase Pojo desde el cursor Sqlite está tomando demasiado tiempo
- No se puede instanciar la aplicación – java.lang.ClassNotFoundException: No encontró la clase "com.xxxxx.App" en path: /data/app/com.xxxxx-1.apk