[내일배움캠프] 캠프 17주차 - 3/12(화) #Reference의 종류

0
post-thumbnail

📝TIL

Reference의 종류

  • 메모리 누수 예방 방법에 대해 알아보던 중, Soft/Weak Reference를 사용하라는 내용이 있었다.
    처음 들어보는 개념이라, 이를 정리해보았다.

📌참고 자료: [Kotlin] Weak Reference | 이현빈

  • Reference의 종류
    • Strong Reference
    • Soft Reference
    • Weak Reference
    • Phantom Reference
  • Reference의 종류는 GC가 제거할 데이터에 우선순위를 부여하여 효율적으로 메모리를 관리하기 위함
    • 제거 우선순위: Phantom> Weak> Soft> Strong

Strong Reference

  • 객체를 생성하면 생기는 참조 형태
  • Strong Reference로 참조되는 객체는 GC 수거 대상에서 제외
var printer: Printer? = Printer()
  • Strong Reference에 null 할당
    -> 객체 인스턴스 unreachable 상태로 변경됨
    -> GC 수거 대상이 됨

Soft Reference

  • Soft Reference로 참조되는 객체는 GC에 의해 수거 될수도 있고 안될수도 있음
    • OOM(Out Of Memory)이 발생하기 전까지 수거되지 X
    • 메모리 용량이 작은 모바일 디바이스의 경우, Weak Reference처럼 동작할수도
var printer: Printer? = Printer()
val soft: SoftReference<Printer> = SoftReference(printer)
  • Soft Reference를 사용하면 좋은 상황 예) 이미지 캐싱
    • 이미지는 메모리 상의 이미지 참조를 항상 포함해야
    • 이미지를 캐싱하는 경우, 메모리 상의 이미지 참조가 포함됨
      -> Strong Reference를 사용하면, 수동으로 처리하지 않으면 OOM 발생 가능
      -> Soft Reference를 사용하면, 메모리가 부족할 때 GC가 처리해줌 -> OOM 예방

Weak Reference

  • Weak Reference로 참조되는 객체는 Strong/Soft Reference로 참조되고 있지 않은 경우 GC에 의해 수거됨
  • GC 수거 우선순위가 높아 캐싱에 활용도 높음
 var printer: Printer? = Printer()
 val weak: WeakReference<Printer> = WeakReference(printer)

Phantom Reference

  • Phantom Reference로 참조되는 객체를 get() 하면 항상 null 반환
  • 객체가 죽었는지 살았는지 판단하기 위해 사용
profile
Be able to be vulnerable, in search of truth

0개의 댓글