티스토리 뷰

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

안녕하세요. 란테입니다.

이게 제 블로그 첫 글이네요.

오늘은 안드로이드에서 메모리 관리를 하기 위한 방법에 대해 적어보겠습니다.

안드로이드에서 각 어플리케이션은 힙 메모리를 할당 받고 그안에서 메모리를 사용합니다.

이 때 직접 메모리를 관리 하는 것이 아닌 시스템에 의해 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 메모리 캐시는 용량이 한정적이므로, 대용량의 캐시를 위해서는 디스크 캐시를 사용해야 하는 것이 좋습니다.


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함