2010-08-23 3 views
2

У меня возникли некоторые проблемы с пониманием, почему этот кодAndroid растровый распределение странность

 
public class BitmapAllocTest extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  
     byte[] b = new byte[20 * 1000 * 1000]; 
     b = null; 
     Bitmap.createBitmap(2500, 2000, Bitmap.Config.ARGB_8888); 
    } 
} 

бросает исключение OutOfMemory на устройстве с пределом 24MB кучи. Если я прокомментирую какое-либо из распределений, он работает нормально. У меня создалось впечатление, что java vm попытается собрать мусор, прежде чем выбросить исключения OutOfMemory.

Я подозреваю, что это связано с андроидом, выделяющим растровые изображения на нативной куче.

ответ

0
У меня создалось впечатление, что java vm попытается собрать мусор перед выбросом исключений OutOfMemory.

Вы должны запускать GC самостоятельно и повторять попытку. Я должен был сделать это недавно и не мог понять, как это сделать.

+0

Я попробовал ваше предложение, призывающее System.gc() перед выделением растрового, также пыталось поймать ошибку, назвав дс(), а затем пытается выделить растровое изображение снова. Я все равно получаю ошибку OOM. :( – Viktor

+0

вы можете показать мне, как вы называете, и повторите его – WarrenFaith

+0

байт [] Ь = новый байт [20 * 1000 * 1000];? б = NULL; System.gc(); попытка { Bitmap.createBitmap (2500, 2000, Bitmap.Config.ARGB_8888); } задвижка (OutOfMemoryError е) { System.gc(); Bitmap.createBitmap (2500, 2000, Bitmap.Config.ARGB_8888); } – Viktor

1

Я отправил это на вопрос трекера и получил этот ответ:

Там есть пара вещей происходит.

В VM на старых устройствах используется консервативная коллекция. Большинство (но не все) устройств работает> = 2.0 будет использовать тип-точный GC, но ни один из них еще не имеет живого точного GC.

Что это означает, то, что вы набора «б = нуль» не гарантирует, что всех копии этой ссылки исчезли - копия все еще может сидеть в реестре где-то, и без что GC не может знать , что он больше никогда не будет использоваться. Это также совершенно законно для компилятора отказаться от задания «b = null» , так как вы больше не смотрите на «b» .

Данные пиксельных изображений битмапа используют магический механизм «внешнего распределения», а не , чем обычный распределитель кучи. Иногда вы получаете неприятные взаимодействий.

Мы работаем над устранением всех этих проблем .

Ссылка: http://code.google.com/p/android/issues/detail?id=10821

Смежные вопросы