📝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 반환
- 객체가 죽었는지 살았는지 판단하기 위해 사용