안드로이드 개발 질문/답변
(글 수 45,052)
밑에서 질문했었는데요... 해결이 안되서.. 이론적인 질문좀 하려고 합니다.
일단 제가 하는 프로젝트는 큰 이미지를 불러와서 줌인,줌아웃,회전,자르기를 하나의 액티비티에서 수행하는 것입니다.
그리고 잘린 이미지를 파일로만들어 path를 반환해줍니다.
여기서 발생하는 문제점은 아주 큰 이미지를 처리하기 때문에 out of memory가 발생한다는 것입니다.
인터넷검색 엄청나게했고, 다 시도해봤습니다.
아웃오브메모리를 거의 해결하긴 했는데요..
문제는 같은 작업을 여러번 반복하다보면 결국 아웃오브메모리가 발생한다는것입니다.
메인액티비티에서 이미지액티비티를 열고 작업을 수행한후 이미지액티미티를 finish합니다.
또다시 메인액티비티에서 이미지액티비티를 열고 작업 수행, finish
..반복..
이게 5번 정도 반복되면 아웃오브메모리가 뜨네요...
그래서 제가 궁금한 것은..
메모리해제를 해줬는데, 왜 이럴까 하는점입니다.
제가 메모리를 해제해준 방법은 아래와 같습니다.
if(mainBitmap!=null){ mainBitmap.recycle(); mainBitmap = null; }
if(((BitmapDrawable)imgView.getBackground()) != null){ ((BitmapDrawable)imgView.getBackground()).getBitmap().recycle(); imgView.getBackground().setCallback(null); }
System.gc();
물론 onDestroy에서 하였습니다.
조언좀 부탁드리겠습니다!
일단 recycle() 를 하면 바로 메모리 해제가 되지는 않습니다.
대략적으로 밖에 알지는 못하지만... Bitmap 은 내부적으로 C 언어로 처리가 되며, recycle()은 Bitmap 만든 어떤 객체에다가 시간 남으면 메모리 해제를 해라고 요청하는 것이기에... System.gc() 랑은 별개로 움직입니다.
(자바 메모리 관리 능력으로는 C 언어가 사용하는 메모리 공간까지 관리하지는 않습니다.)
머 방법이라면 이미지 액티비티에 들어올때 메모리 공간의 여유가 있는지 확인해서 공간이 있다면 호출하고 아니면 대기타면서 체크하고... 그러다 공간생기면 보여주고... 시간 지나고 안 생기면.... 머 그건... -_-;; 적당히 알아서.....
적당한 시간만 지나면 없어집니다.
이건 MediaPlayer 또한 마찬가지입니다.