Ho ricevuto il seguente rapporto anomalo anomalo per la mia app Android da Google Play (notare la quantità di allocazione rispetto allo spazio disponibile disponibile) -java.lang.OutOfMemoryError su Android 5.0, causato da un'allocazione 16k quando 5M è disponibile
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 x.a.onHandleIntent(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)
sono a conoscenza di una serie di domande OutOfMemoryError su SO, ma sembra che nessuno di loro è causata da allocazione di byte molto più piccolo lo spazio libero disponibile.
L'utente utilizzava un Galaxy S5 su Android 5.0 e ha riferito che tali arresti anomali si verificano durante il gioco (e quali giochi non contano), il che suppongo che ciò si ripresenti ogni volta che lui/lei sta usando un'altra app intensa in memoria in primo piano e il servizio in background della mia app è pianificato per essere eseguito. Essendo un rapporto di Google Play, non ho altri mezzi per ottenere maggiori dettagli.
La mia domanda è, che cosa potrebbe causare che ciò accada e qualsiasi misura che un'app potrebbe adottare per evitarlo?
Un po 'di sfondo (nel caso questo sia rilevante): il suddetto crash proviene da un servizio in background periodicamente pianificato della mia app, che non coinvolge alcuna interfaccia utente/bitmap. Tutto ciò che fa è il download dei dati dal server e l'aggiornamento del database/stato. Ha funzionato senza problemi in macchine di 5 anni con molta meno RAM, e dovrebbe essere molto leggero sulla memoria secondo gli standard dei moderni telefoni Android. L'istanza di errore sopra riportata si verifica in un punto successivo all'aggiornamento del database e il servizio sta scrivendo lo stato aggiornato sulla preferenza condivisa.
Modifica: basta leggere OutOfMemoryError in android on allocation 4Mb when 10Mb is free che è stato collegato a questa domanda dopo la pubblicazione, ma sembra piuttosto improbabile che lo spazio libero disponibile possa essere così frammentato in questo caso? C'è qualche altra possibile causa?
https://github.com/facebook/fresco/issues/404 https://github.com/facebook/fresco/issues/159 –