[Android] Android Memory 관리 (Reference를 중점으로)

Jay·2021년 4월 13일
2

Android

목록 보기
29/39
post-thumbnail

Reference를 알아보자.

Reference Object

  • 자바와 안드로이드에서 사용 가능

우선 개념부터 알고가자.

Reachability

  • GC에서는 reference의 강약에 따라 도달 가능한 객체를 제외하고 모두 쓰레기로 간주한다.
  • GC의 관점에서는 객체를 참조가 가능한 객체참조할 수 없는 객체 2가지로 본다.
  • 다시 사용 가능한지? 다시 사용 불가한지?

여기서 참조의 강약에 따라 Strong Reference, Soft Reference, Weak Reference, Phantom Reference ... 으로 나뉘고 순서대로 참조가 강하다.

하나의 객체가 Strong과 Weak 참조가 있다면 그 객체는 Strong한 객체로 여겨진다.

Strong Reference

  • new를 사용해 생성된 객체! (Heap영역에 적재)
  • 이 객체는 GC에서 무조건 제외되기에 메모리 누수를 방지하기 위해서는 이 참조를 주의해서 봐야 한다.
  • 이 참조를 지워주지 않으면 GC에 의해 수거되지 않고 남아있기 때문에 메모리 누수 유발 가능하다.

Soft Reference

  • 객체의 참조를 넘겨줌으로서 생성이 된다.
    SoftReference object = new SoftReference(new Object());
  • 이 참조는 메모리가 충분하다면 GC의 수거 대상이 되지 않고, 메모리에 여유가 없다면 GC에 의해 수거된다.

Weak Reference

  • Soft Reference와 유사하지만 GC가 발생되기 전까지는 참조를 유지하고 GC가 발생하면 무조건 회수된다는 점에서 차이가 있다.
  • 짧은 시간, 자주 쓰일 수 있는 객체를 이용 할 때 유용하게 사용이 된다.
  • GC 발생 전까진 특정 객체가 캐쉬 역할처럼 할 수 있지만 GC가 발생할 경우, 해당 부분을 null로 만들고 다시 채움으로써 메모리 누수를 방지 할 수 있다.

활용 사례

WeakReference obj = new WeakReference(new Sample());
Sample ex = obj.get();
//필요 작업 수행
ex = null;

위의 참조별 종류를 읽었다면 obj객체가 어떤 참조인지 알 것이다.
Sample()을 전달 인자로 넘겨줘서 Weak Reference이지만, new로 생성되었기에 Strong Reference를 갖게 된다.
그래서 GC에 의한 제거 대상이 아니다!
그렇기에 필요 작업만 수행하고나서, ex=null 해줌으로써 Strong을 제거 해줌으로 인해 Weak 해짐으로써 GC의 수거 대상이 되어 OOM을 방지할 수 있다.

profile
developer

1개의 댓글

comment-user-thumbnail
2023년 3월 28일

좋은 글 감사합니다 ^^

답글 달기