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

비트맵 관리 어떻게 하나요?

0 추천

현재 개발중인 어플내에서 특정 문서양식을 만들어 PDF파일로 제공해주는 기능이 있습니다.

문서양식에는 어플이용자의 정보가 문서에 포함되기 때문에 비트맵을 만들어 캔버스로 직접 그려서

PDF파일로 만들고 있습니다.

 

이 기능은 특정 액티비티에서 PDF문서 발행이라는 버튼을 누르면 해당 문서의 프리뷰 화면이 뜹니다.

이때 캔버스로 그려서 문서양식을 만들어 프리뷰화면에 띄워주고 있구요..그리고 사용자가 

확인 후 인쇄를 선택해서 인쇄 할 수 있도록 로직이 구성되어 있는데요, 문제가..

PDF문서 발행이라는 버튼을 눌러서 프리뷰화면을 볼때마다 사용 메모리가 점점 쌓입니다..

물론 이문제에 대한 대책으로 프리뷰화면이 onDestroy될때 사용한 모든 비트맵을

recycle및 null로 참조해제 및 GC를 호출 해주고 manifest에 large-heap도 해주었습니다.

이렇게 했는데도... 해당기능 버튼을 누를때 마다 사용 메모리는 계속 쌓이더군요....

테스트해보면 해당 기능을 50번 실행시켰을때 OOM이 발생합니다..

물론 현재 예측상 사용자가 50번이나 실행시킬 가능성은 희박하지만.. 만약이란게 있어서..

 

GC_BEFORE_OOM freed 74K, 1% free 516737K/518636K, paused 62ms, total 62ms
Out of memory on a 9272336-byte allocation.
 

로그에는 위와 같이 나오구요.. 그리고 테스크메니져 실행시켜서 해당 어플메모리사용량을 보면

520MB까지 사용합니다.. 이게 정상적인건 아니잖아요..이렇게 메모리 사용량 많은 어플 본적이없어서..

이거 어떻게 해결을 해야 할 지 잘 모르겠습니다.. 조언 부탁드립니다.

 
익명사용자 님이 2015년 3월 9일 질문

2개의 답변

+2 추천
 
채택된 답변

이미지 관리는 오픈 소스 라이브러리들을 사용하시는걸 추천드립니다.

직접 캐싱기능을 구현하셔도 상관은 없으나 그로 인한 버그 및 메모리 관련 이슈들이 많이 생길 것이기 때문에

이미 검증된 라이브러리를 이용하시는것이 좋습니다.

아래 블로그를 잘 읽어보시고 입맛에 맞는 라이브러리를 사용하시면 될 듯 합니다.

http://helloworld.naver.com/helloworld/429368

Gradler (109,780 포인트) 님이 2015년 3월 9일 답변
일단 답변해주신 자료 자세히 보지는 않았지만..
제가 저 자료를 보고 바로 든 의문이.. 저는 지금 여러 이미지를 불러오는게 아니고 Bitmap을 코드상에서 생성해서 문서양식을 만들고 보여주도록 하고있습니다. 그리고 사용자가 닫기를 누르게되면 onDestroy에서 리사이클을 사용하여 GC가 불려지도록 했는데 시간이 지나도 사용 메모리가 회복되지 않습니다. 계속 쌓여만 있는 상태구요.. 이런 상황에서 이미지관리 라이브러리를 어떻게 활용을 하여야 할까가 의문이네요.. 일단 급해서 댓글부터 달았지만,, 한번 자세히 알아보도록은 하겠습니다.
여러 이미지를 불러오는게 아니라 할지라도 이미지 프로세스가 자주 이뤄지는 편이라면 라이브러리 사용하시는걸 추천드립니다. 메모리관리나,  캐싱 기능을 제공하니까요.

그리고 Bitmap 뿐만 아니라 사용한 View도 null로 참조해제를 해주셔야지만 메모리가 반환됩니다. 이 부분도 참고하세요
감사합니다. 사용한 View도 null로 참조해제 해주니 메모리 반환되네요. 처음 답변해주신 라이브러리 부분도 참고하도록 하겠습니다.
써본 것 중에는 picaso가 제일 낫더군요
0 추천
개인적으로 recycle, 하였을 경우, 메모리가 잘 해제되는 것을 확인하였던 경험이 있는데, 혹시 이미지를 리사이징 한다던가 하면서 릭이 발생하지는 않는지 확인해보세요.
안_드루이드 (14,510 포인트) 님이 2015년 3월 9일 답변
...