안드로이드 개발 질문/답변
(글 수 45,052)
ImageView가 많은 앱을 만드는 중인데
디자이어폰에서 테스트할 때마다
내부용량이 줄어들어요.
실행종료를 할때 어떤 처리를 해줘야
이런 문제가 해결될까요?
알려주세요.
디자이어폰에서 테스트할 때마다
내부용량이 줄어들어요.
실행종료를 할때 어떤 처리를 해줘야
이런 문제가 해결될까요?
알려주세요.
2010.07.05 05:59:31
테스트 할 때 마다 용량.. 당연히 줄어들겁니다.
용량이 줄어들었다가 액티비티가 전부 다 종료된 후에 gc 호출 후에도 줄어들지 않는다면 문제가 있습니다.
보통 memory leak 이 나는 케이스가..
Cursor 를 열고 close 안했다던가
BroadcastReceiver 를 연결하고 안끊었다던가
BitmapFactory 를 사용했다던가 할때 날 수 있습니다.
위에 두개는 로직상의 문제이고
BitmapFactory 의 문제는.. 걍 경험상 + 능력껏 피해가는 수 밖에 없습니다.
최대한으로 조금만 새도록.. 끄응.. -_-;
2010.07.05 09:32:39
전설로 내려져 온다는 BitmapFactory 메모리 릭 인가요..ㅠㅠ
저같은 경우 Bitmap 을 만들때 BitmapFactory 를 사용안하고 아래와 같이 사용하고 있습니다. ㅋ
그런데 BitmapDrawable 내부에서 BitmapFactory 를 사용한다고 들은것 같기도 하고요-_-;;
여튼 BitmapFactory 에서의 메모리 릭은 전설로 내려져오고 있으니 깐요 ㅠㅠ
BitmapDrawable drawable = (BitmapDrawable) mContext.getResources().getDrawable(R.drawable.img);
Bitmap img = drawable.getBitmap();
저같은 경우 Bitmap 을 만들때 BitmapFactory 를 사용안하고 아래와 같이 사용하고 있습니다. ㅋ
그런데 BitmapDrawable 내부에서 BitmapFactory 를 사용한다고 들은것 같기도 하고요-_-;;
여튼 BitmapFactory 에서의 메모리 릭은 전설로 내려져오고 있으니 깐요 ㅠㅠ
BitmapDrawable drawable = (BitmapDrawable) mContext.getResources().getDrawable(R.drawable.img);
Bitmap img = drawable.getBitmap();
2010.07.08 12:38:25
bitmapfactory가 문제라고 하기엔 실험이 하나 남았다고 보는데요. 아무도 그런언급하는 사람도 없어서 제가 적어봅니다.
imageView.setImageBitmap(bm);
이렇게 bitmap을 연결했다면 bitmap을 recycle해야 하는데 그 시점을 잡는게 쉽지 않죠.
시점이야 어플 나름인거니까 패스하고
((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle()
이런형식도 가능하긴한데 제약조건이 존재하더군요. 리소스의 Bitmap은 오직 하나만 존재하는거라서 그거 recycle하면 재앙이 옵니다.
그리고 resource를 통해서 만든 Bitmap은 그냥 파일당 하나만 존재하는거니까 릭하고는 크게 관련없습니다.
릭으로 뻗는 케이스는 외부 파일을 로드하는 케이스겠죠.
그래서 저는 일단 어플에서 recycle이 되어야 하는 시점을잡고 해당 imageview가
리소스에서 얻어온 BitmapDrawable인지 검사하고 그게 아니면 클리어하는 걸로 가닥을 잡았습니다.
bitmap이 명시적으로 recycle을 안하믄 GC에 의해 정리되지 않는 특성이 여기서 사람 골을 때리는듯합니다.
결론은 엑티비티죽을때나 컨트롤 사라질때 혹은 뷰가 정리당할때 bitmap recycle... 이거 해보고도 똑같이 릭나면
그땐 정말 전설이 사실임이 증명되겠죠.
imageView.setImageBitmap(bm);
이렇게 bitmap을 연결했다면 bitmap을 recycle해야 하는데 그 시점을 잡는게 쉽지 않죠.
시점이야 어플 나름인거니까 패스하고
((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle()
이런형식도 가능하긴한데 제약조건이 존재하더군요. 리소스의 Bitmap은 오직 하나만 존재하는거라서 그거 recycle하면 재앙이 옵니다.
그리고 resource를 통해서 만든 Bitmap은 그냥 파일당 하나만 존재하는거니까 릭하고는 크게 관련없습니다.
릭으로 뻗는 케이스는 외부 파일을 로드하는 케이스겠죠.
그래서 저는 일단 어플에서 recycle이 되어야 하는 시점을잡고 해당 imageview가
리소스에서 얻어온 BitmapDrawable인지 검사하고 그게 아니면 클리어하는 걸로 가닥을 잡았습니다.
bitmap이 명시적으로 recycle을 안하믄 GC에 의해 정리되지 않는 특성이 여기서 사람 골을 때리는듯합니다.
결론은 엑티비티죽을때나 컨트롤 사라질때 혹은 뷰가 정리당할때 bitmap recycle... 이거 해보고도 똑같이 릭나면
그땐 정말 전설이 사실임이 증명되겠죠.
2010.11.27 10:43:32
Bitmap에 의한 메모리 릭 전설은 사실입니다.
제가 직접 격어 봤죠 ㅋㅋ
제가 만들 어플의 경우 이미지를 많이 사용하고 제가 다양한 방법을 잘몰라서 Bitmap과 BitmapFactory에 의한 이미지 사용을 많이 하고있는데요. 스트레스 터스트를 하면서 디바이스가 보내주는 로고를 분석해보면 Out of Memory가 발생하는데 한 어플당 메모리 사용을 16M이상 사용하게 되면 발생하게 되는 것입니다.
Out of Memory에서 Bitmap같은 메모리를 많이 사용하는 이미지를 계속적으로 해제하지 않고 사용하기에 쌓이게 되는것인데요.
어플의 어느 시점에서 recycle()을 사용하는지는 각자의 몪이지만 recycle()사용 후 Bitmap에 null를 설정해주는 것이 안전하고 좋은거 같습니다.(이거 알기전까진 가비지 컬랙션으로 자동으로 해제해 주는줄 알았어요 ㅠ.ㅠ)
음...Bitmap의 경우 제가 메모리문제를 해결하였지만 개인적으로 Drawable과 ImageView를 ListView에서 사용하였을 때 메모리문제는 어찌 해결해야 되는지 궁금하네요 ㅠ.ㅠ