안드로이드에서 메모리 관리
안녕하세요. 란테입니다.
이게 제 블로그 첫 글이네요.
오늘은 안드로이드에서 메모리 관리를 하기 위한 방법에 대해 적어보겠습니다.
안드로이드에서 각 어플리케이션은 힙 메모리를 할당 받고 그안에서 메모리를 사용합니다.
이 때 직접 메모리를 관리 하는 것이 아닌 시스템에 의해 Garbage Collect 로 메모리를 관리하게 됩니다.
이로 인해 유저는 대용량의 메모리를 사용해야 하는 작업을 할 경우 OOM (Out of Memory) 에서 자유로울 수 없습니다.
이를 해결 하기 위해서 여러가지 방법이 존재하고 있습니다.
1. 해당 객체에 null 설정.
기본적으로 객체는 Strong Reference 로 이루어져있고 해당 객체의 Reference Count 를 0 으로 만들어 GC의 대상이 되도록 설정하는 방법이 있습니다. 이를 위해 해당 객체에 null을 설정하여 연결 고리를 줄이는 작업이 도움이 될 수 있습니다.
2. Weak Reference, Soft Reference 설정.
null 설정을 하는것은 다음 GC가 이루어져야만 메모리 관리가 이루어지므로 그 사이에 메모리 부족 상태가 되면 OOM이 발생하게 됩니다. 이를 해결하기 위해 Weak Reference 와 Soft Reference를 통한 메모리 관리를 이용하게 됩니다. Weak Reference 는 Reference Count 에 상관없이 GC의 대상이 되도록 하는 방식을 말합니다. 짧은 시간동안 자주 이용될 객체에 적용하면 유용하게 사용 할 수 있습니다.
WeakReference sr = new WeakReference(new Object());
위와 같이 선언하여 사용합니다.
Soft Reference 는 Weak Reference 보다는 조금 더 강한 연결입니다.
OOM이 발생하기 전까진 GC의 대상이 되지 않다가 OOM이 발생하게 되면 GC처리 되도록 설정합니다.
3. LRU CACHE, DISK CACHE
Weak Reference 를 이용한 메모리 관리는 강력하지만 그만큼 잦은 GC로 인한 객체 손실의 위험을 갖고 있습니다.. 이용중인 객체가 중간에 메모리 정리되어 사라지게 되면 불편한 경우가 자주 발생 할 수 있습니다.. 이를 위해 안드로이드에서는 메모리 캐시를 지원하고 있습니다. LRU CACHE에 이미지를 저장해놓고 캐시에 올려져 있다면 그대로 불러다 쓸 수 있습니다. 다시 자주 사용해야 하는 데이터에 대해서 LRU 캐시를 이용하면 빠른 데이터 이용이 가능합니다.
mMemoryCache = new LruCache(cacheSize) ;
위와 같이 선언하고,
if(mMemoryCache !=null) bitmap = mMemoryCache.get(item.title);
if(bitmap!=null){
Log.d(TAG,"Image Already Loaded");
}else{
Log.d(TAG,"Image Not Loaded");
bitmap = BitmapFactory.decodeFile(item.title);
mMemoryCache.put(item.title,bitmap);
}
위와 같이 사용하면 그리드뷰나 리스트 뷰처럼 스크롤되면 바로 다시 사용되야하는 데이터에 이용할 수 있습니다. 하지만 LRU 메모리 캐시는 용량이 한정적이므로, 대용량의 캐시를 위해서는 디스크 캐시를 사용해야 하는 것이 좋습니다.