2016-01-05 46 views
5

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?

+0

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

Odpowiedz

0

jeśli używasz Androida Studio, dodaj "LargeHeap = true" do pliku manifestu.

Tak;

android: largeHeap = "true"

+0

Dzięki, ale problemem nie jest to, że moja usługa jest szczególnie głodny pamięci, więc jest zdecydowanie zbyt zabójczy i nie jest zalecany praktyka http://stackoverflow.com/questions/27396892/androidlargeheap-true-in-mainifast-advantages – headuck

+0

Nie sądzę, że dobrze jest dodać bigheap do true. i zgodnie ze stosu, nie ma operacji bitmapowej są wykonywane dla spowodowania oom.http: //stackoverflow.com/questions/27396892/androidlargeheap-true-in-mainifast-advantages – mcd

0

Mam w obliczu podobnego problemu. To, co zrobiłem, aby rozwiązać to

  1. utworzyć nowy folder rozciągliwej-nodpi w swoim RES/Folder
  2. Przenieś wszystkie "images" w/folderu rozciągliwej do/folderu rozciągliwej-nodpi

Mam nadzieję, że to pomoże komuś :)

+0

Dzięki, może przydatne dla innych, ale w moim przypadku jest to proces w tle bez użycia wyciągnięcia, więc nie dotyczy to mnie. – headuck