2016-01-05 33 views
5

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?

+0

https://github.com/facebook/fresco/issues/404 https://github.com/facebook/fresco/issues/159 –

risposta

0

se si utilizza Android Studio quindi aggiungere "LargeHeap = true" nel file manifest.

In questo modo;

android: largeHeap = "true"

+0

Grazie, ma il problema non è che il mio servizio è particolarmente affamato di memoria, quindi è decisamente un over-kill e non è raccomandato pratica http://stackoverflow.com/questions/27396892/androidlargeheap-true-in-mainifast-advantages – headuck

+0

non penso quindi sia una buona idea aggiungere bigheap a true. e in base allo stacktrace non viene eseguita alcuna operazione di bitmap per causare oom.http: //stackoverflow.com/questions/27396892/androidlargeheap-true-in-mainifast-advantages – mcd

0

Ho affrontato problema simile. Questo è quello che ho fatto per risolverlo

  1. Creare una nuova cartella drawable-nodpi nelle vostre res/cartella
  2. Spostare tutte le "immagini" nella cartella/drawable a/cartella drawable-nodpi

Spero che questo aiuti qualcuno :)

+0

Grazie, forse utile per gli altri ma nel mio caso particolare è un processo in background senza utilizzare alcun drawable, quindi questo non è applicabile a me. – headuck