Otrzymałem następujący dziwny raport o awarii dla mojej aplikacji na Androida z Google Play (zanotuj kwotę alokacji w stosunku do dostępnej wolnej przestrzeni) -java.lang.OutOfMemoryError na Androida 5.0, spowodowane przez alokację 16k, gdy dostępna jest 5M
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)
Jestem świadomy wielu pytań OutOfMemoryError na SO, ale wygląda na to, że żaden z nich nie jest spowodowany przydzieleniem bajtów o wiele mniejszym niż dostępna wolna przestrzeń.
Użytkownik korzystał z Galaxy S5 na Androidzie 5.0 i zgłosił, że takie awarie występują podczas grania w gry (i które gry nie mają znaczenia) - co uważam za powtarzające się, gdy używa innej aplikacji intensywnie wykorzystującej pamięć na pierwszym planie i usługa w tle mojej aplikacji ma zostać uruchomiona. Będąc raportem Google Play, nie mam innego sposobu na uzyskanie więcej szczegółów.
Moje pytanie brzmi, co może spowodować to zdarzenie, a także wszelkie środki, które aplikacja może podjąć, aby tego uniknąć?
Niektóre tła (w przypadku, gdy jest to istotne): powyższa awaria pochodzi z okresowo zaplanowanej usługi w tle mojej aplikacji, która nie zawiera żadnych UI/bitmap. Wystarczy pobrać dane z serwera i zaktualizować bazę danych/status. Przebiegł bez problemu w 5-letnich komputerach z dużo mniejszą pamięcią RAM i powinien być bardzo lekki w pamięci przez standardy współczesnych telefonów z Androidem. Powyższe wystąpienie błędu występuje w punkcie po aktualizacji bazy danych, a usługa zapisuje zaktualizowany status do współużytkowanej preferencji.
Edycja: wystarczy przeczytać OutOfMemoryError in android on allocation 4Mb when 10Mb is free, która została powiązana z tym pytaniem po opublikowaniu, ale wydaje się całkiem nieprawdopodobne, aby dostępna przestrzeń mogła być w takim przypadku fragmentaryczna? Czy jest jakaś inna możliwa przyczyna?
https://github.com/facebook/fresco/issues/404 https://github.com/facebook/fresco/issues/159 –