Podczas zmiany rozmiaru dużych bitmap dla szybszego przesyłania zdjęć na serwer, od czasu do czasu wpadałem na OutOfMemoryErrors. Aby temu zapobiec, obliczam wymaganą ilość pamięci i sprawdzam, czy przekracza skalowalność Runtime.getRuntime(). MaxMemory() przed próbą skalowania obrazu.Sterty nie rozwijały się na emulatorze Genymotion
Jednak nadal napotykam na błędy OOM, mimo że obraz powinien łatwo zmieścić się na stercie.
Emulowane urządzenie (Galaxy SII API 16) daje maksymalną pamięć 67108864 bajtów przy użyciu powyższej metody.
W poniższym fragmencie rozmiar sterty wynosi 43975 K i tylko < jest używane 15 000 MB tej pamięci. Przy mojej alokacji ~ 31K strop powinien rosnąć automatycznie do około 45K, który wciąż nie jest nawet zbliżony do maksymalnego rozmiaru 64 MiB. Ale jak widać, zamiast rozszerzania sterty, dalvik vm zabrakło pamięci.
10-13 20:35:57.223: D/dalvikvm(1201): GC_FOR_ALLOC freed 505K, 67% free 14692K/43975K, paused 31ms, total 31ms
10-13 20:35:57.223: I/dalvikvm-heap(1201): Forcing collection of SoftReferences for 31961100-byte allocation
10-13 20:35:57.251: D/dalvikvm(1201): GC_BEFORE_OOM freed 2K, 67% free 14689K/43975K, paused 29ms, total 29ms
10-13 20:35:57.251: E/dalvikvm-heap(1201): Out of memory on a 31961100-byte allocation.
Zastanawiam się, czy to może się zdarzyć na prawdziwym urządzeniu czy też może to być błąd genymotion.
Czy sterty gwarantowane rozszerzenie do maxMemory()? JavaDoc dla Runtime.getRuntime(). FreeMemory() mówi, że "może" rozwinąć, cokolwiek to znaczy.
Potrzebuję tylko realiable sposób obliczenia ilości pamięci można używać, to jest, jak to zrobiłem, proszę mnie poprawić, jeśli się mylę:
long maxMemory = Runtime.getRuntime().maxMemory();
long usedMemory = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
long availableMemory = maxMemory - usedMemory;
To wywołanie powoduje OutOfMemoryError:
// outOptions has an appropriate inSampleSize
BitmapFactory.decodeStream(inputStream, null, outOptions);
Czy rozwiązałeś ten problem? – KinGPinG
Niestety nie. Jakieś pomysły? – wkarl
Nie, przykro mi, wciąż mam z tym problemy. Dam ci znać, jeśli znajdę coś przydatnego. – KinGPinG