2015-03-21 2 views
1

Несколько дней назад мне дали solution проверки столкновения между двумя растровыми изображениями, которые имеют config_alpha_8. Но при использовании его я заметил, что мое приложение начал отставать странно, и когда я проверил журналы, я заметил, что сборщик мусора был спамить каждую миллисекундуByteBuffer = Спасатель сборщиков мусора

enter image description here

Я попытался удалить несколько строк, и выяснили, что вызывает сборщик мусора собирается шумиха ш * т были эти строки:

byte[] pixelData = getPixels(bitmap1); 
byte[] pixelData2 = getPixels(bitmap2); 

, который назвал эту функцию:

public byte[] getPixels(Bitmap bmp) { 
    int bytes = bmp.getRowBytes() * bmp.getHeight(); 
    ByteBuffer buffer = ByteBuffer.allocate(bytes); 
    bmp.copyPixelsToBuffer(buffer); 
    return buffer.array(); 
} 

Почему ? Что я могу сделать, чтобы остановить?

+0

Что вы пытаетесь остановить. Выделение или сообщение журнала GC_FOR_ALLOC? –

+0

@StephenC как я думаю, я не забочусь о сообщениях, я забочусь о том, что сборщик мусора продолжает называться no-stop. – SpoocyCrep

ответ

1

Вы выделяете большие смежные блоки памяти (то есть a byte[]). В зависимости от того, насколько велики ваши изображения, это может составлять значительную часть вашей доступной кучи. Если вы собираетесь выполнять много операций такого типа, возможно, стоит рассмотреть вопрос об объединении byte[] экземпляров фиксированных размеров для повторного использования.

+0

Спасибо, я попробую – SpoocyCrep

+0

Однако будьте осторожны, что пул объектов, который реализован без достаточного понимания, может легко ухудшить ситуацию. Как и в OOME. –

+0

@ StephenC Uhm, так что, пожалуйста, помогите мне? Я не очень хорош с бассейнами. – SpoocyCrep

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