자주 사용하는 비트맵에서 늘상 궁금하던 부분이 있는데요.
보통 우리가
Bitmap b1 = BitmapFactory.decodeStream(is);
형식으로 비트맵을 생성하고, 필요 없는 시점에 소멸을 시키잖아요?
그렇다면
Bitmap b2 = Bitmap.createBitmap(b1, 0,0, width, height, matrix, true);
으로 새로운 비트맵을 생성하면
현재 b1, b2 두개의 비트맵이 메모리에 할당된거죠?
그럼 여기서 질문 하나요..
b1 = Bitmap.createBitmap(b1, 0, 0, w, h, m, true);
로 선언하면 원래 메모리에 할당된 b1을 해제하고 다시 할당하는건가요?
아님 replace되는건가요? 만약 replace된다면 메모리가 해제되지 않고 남는 조각(?)같은건 없을까요??
항상 궁금했던부분이내요.
답변 좀 부탁드립니다.
이런 코드가 많으면 메모리 릭이 생깁니다. 두번째 b1은 메모리에 새로운 비트맵을 생성한겁니다. Bitmap.createBitmap() 을 사용한게 new Bitmap(); 한거라고 보시면 됩니다. 첨에 썼던 b1은 참조하는 변수가 없으니 gc에의해 해제되어야 하지만 그 시점이나 성공여부를 알 수가 없죠. 사실 제대로 안된다고 보시면 됩니다. 그래서 이런 코드가 많거나 주기적으로 호출되면 메모리 누수에 의해 앱이 죽는현상을 겪게됩니다. 비트맵을 다 사용한 뒤에는 항상 recycle 해주시는게 좋습니다.
위에서는 b1을 다시 할당하기전에 b1.recycle(); 을호출하시는게 좋지요.
전 이렇게 씁니다.
if(b1 != null){
b1.recycle(); b1=null;
}
b1 = Bitmap.createBitmap(......);




메모리 릭이 발생할 소지가 다분하다고 봅니다.
우선 비트맵은 recycle을 명시적으로 해주지 않으면 많은 경우에 (전부는 또 아니고... ㅡㅡㅋ) 메모리 Leak이 발생합니다.
recycle이 되지 않은 그러나 gc될 가능성이 있는 객체 하나 (먼저 만든 b1...)와
b1으로 참조하고 있는 객체 하나가 있는겁니다.