마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

이미지뷰 및 구글맵 사용시 메모리 관리 질문입니다

0 추천
    @Override
    public void onDestroy() {

        requestQueue.stop();
        requestQueue.start();

        map.onDestroy();
        map = null;

        UIUtil.recycleAllImageBitmap((ViewGroup) ((ViewGroup) this.findViewById(android.R.id.content)).getChildAt(0));

        imageBitmap.recycle();
        resizedBitmap.recycle();

        Glide.get(this).clearMemory();
        System.gc();

        RefWatcher refWatcher = GlobalApplication.getRefWatcher(this);
        refWatcher.watch(this);
        super.onDestroy();
    }

 

액티에서 volley로 서버의 이미지를 불러오고, Glide로 이미지뷰에 넣어주고 구글맵뷰도 불러오고 있습니다.

이 액티를 들어갔다 나오면 메모리가 너무많이 쌓여서 위와 같이 코드들을 넣어주었습니다.

그런데도 크게 차이는 못느끼겠습니다, 들어갔다 나왔다 10번정도 반복하면 앱이 재시작(완전 재시작은 아니고 해당 액티에서 검은색화면 뜨면서 꺼졌다 켜진뒤 보던 화면이 다시 뜨고, 메모리는 초기화됩니다)

프로파일러에서 보니깐 bitmap이 차지하는 양이 상당하더라고요, 그래서 글라이드로 이미지 넣어줄때 이미지 크기를 낮게 잡아봤더니 메모리 상승폭이 줄어드는게 체감은 되는데

여전히 메모리가 계속 쌓입니다.. 

 

volley는 메모리 누수 버그가 있었는데 fix됬다고 하는 최신버전 쓰고있고요,

onDestroy에서

이미지뷰는 따로 헬퍼클래스에서 모든 이미지뷰에 null을 넣어주고 있고요,

구글맵도 검색해본결과 메모리 leak을 해소하는 방법 사용해보고 있고

모든 bitmap 다 recylcle 시키고 gc까지 명시해주고 하는데도

메모리가 계속 쌓이니 미치겠습니다ㅠ

 

혹시 제가 놓친 부분이 있거나 bitmap으로 인한 메모리 누수에 도움되는 방법 있으면 알려주시면 감사하겠습니다.!

파르네제 (2,030 포인트) 님이 2018년 8월 9일 질문

1개의 답변

0 추천
 
채택된 답변
androidManifest.xml 에 largeHeap=true 로 넣어보세요

일단 메모리 양을 늘릴 필요도 있어 보입니다.

그리고 누수라기 보다는 가비지 콜렉터가 동작 특성에 따라 달라지니 LeakCanary 로 정말 Leak 이 맞는지도 확인해보세요
aucd29 (218,390 포인트) 님이 2018년 8월 9일 답변
파르네제님이 2018년 8월 21일 채택됨
답변 감사합니다, 메모리힙 늘리는건 적용해봐야겠네요,
릭카나리는 돌리고있는데 메모리 덤프, 윌 프리징 메시지가 뜨고 있습니다
...