티스토리 뷰
안녕하세요. 란테입니다.
이게 제 블로그 첫 글이네요.
오늘은 안드로이드에서 메모리 관리를 하기 위한 방법에 대해 적어보겠습니다.
안드로이드에서 각 어플리케이션은 힙 메모리를 할당 받고 그안에서 메모리를 사용합니다.
이 때 직접 메모리를 관리 하는 것이 아닌 시스템에 의해 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 메모리 캐시는 용량이 한정적이므로, 대용량의 캐시를 위해서는 디스크 캐시를 사용해야 하는 것이 좋습니다.
'프로그래밍 > ANDROID' 카테고리의 다른 글
Android Architecture Components (AAC) 를 Realm과 접목시켜보자 (0) | 2017.11.23 |
---|---|
[번역] [Qiita] RxJava2 에서 변경점 요약 (0) | 2017.06.09 |
[Android/IOS] Firebase Cloud Message (FCM) 유의점 정리 (0) | 2017.02.27 |
[번역] [Qiita] RecyclerView에 새롭게 적용된 ItemPrefetch 알아보기 (0) | 2016.11.27 |
[Qiita] 안드로이드 테스트에 도움되는 툴 2가지 소개 (0) | 2015.10.26 |
- Total
- Today
- Yesterday
- Redux
- observable
- 여행
- Qiita
- 평양냉면
- 도쿄
- 우래옥
- 리액트
- 리액트네이티브
- 필동면옥
- 청계천 맛집
- 브이로그
- 일본여행
- 도쿄맛집
- 중쇄를찍자
- 수요미식회
- 안드로이드
- android
- react native
- 야키니쿠
- 편육
- 덴뿌라
- 을지면옥
- 맛집
- 평양면옥
- 을지로3가
- mobx
- 리액트 네이티브
- 일드
- 쿠로키 하루
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |