[Android] 가비지 컬렉터(Garbage Collector), 참조(Reference)에 대해 알아보자
# Java의 Garbage Collector
1. 힙(heap) 내의 객체 중에서 가비지(garbage)를 찾아낸다.
2. 찾아낸 가비지를 처리해서 힙의 메모리를 회수한다.
# GC와 Reachability
- Java GC는 객체가 Garbage인지 판별하기 위해서 Reachability라는 개념을 사용
- 어떤 객체에 유효한 참조가 있으면 'reachable', 없으면 'unreachable'
- unreachable 객체를 가비지로 간주해 GC를 수행
- 유효한 최초의 참조가 있어야 하는데 이를 객체 참조의 root set
# Reference
- java.lang.ref는 Strong reference, Soft reference, Weak reference, Phantom reference를 클래스 형태로 제공
- SoftReference, WeakReference, PhantomReference 3가지 클래스에 의해 생성된 객체를 "Reference object"라고 부름
- reference object에 의해 참조된 객체는 "Referent"라고 부름
- WeakReference 클래스가 객체를 생성하는 예이다.
WeakReference<Sample> wr = new WeakReference<Sample>(new Sample());
Sample ex = wr.get();
...
ex = null;
위 코드의 마지막 줄에서 ex참조에 null을 대입하면 처음 생성한 Sample 객체는 오직 WeakReference 내부에서만 참조된다.
이 상태의 객체를 weakly rechable 객체라고 한다.
이 경우 Sample object가 weakly reachable 객체
# Reference와 Rechability
- Reference를 이용하여 Rechability를 지정하고 메모리를 회수할 수 있다.
# Reference 종류
- 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로 만들고 다시 채움으로써 메모리 누수를 방지 할 수 있다.
# Softly Rechable과 SoftReference
- softly rechable 객체의 GC를 조절하기 위해 다음 JVM 옵션을 제공한다.
- 옵션의 기본값은 1000
-XX:SoftRefLRUPolicyMSPerMB=<N>
- softly rechable 객체의 GC여부는 위 옵션의 설정한 숫자에 따라 다음 수식에 의해 결정된다.
(마지막 strong reference가 GC된 때로부터 지금까지의 시간) > (옵션 설정값 N) * (힙에 남아있는 메모리 크기)
- 옵션 설정값이 1000이고 남아 있는 메모리가 100MB이면, 수식의 우변은 1,000ms/MB * 100MB = 100,000ms = 100sec, 즉 100초가 된다.
- 따라서 softly rechable 객체가 100초 이상 사용되지 않으면 GC에 의해 회수 대상이 된다.
# ReferenceQueue
- SoftReference와 WeakReference는 ReferenceQueue를 인자로 받는 생성자를 사용할 수 있다.
- SoftReference 객체나 WeakReference 객체가 참조하는 객체가 GC대상이 되면 SoftReference 객체,
WeakReference 객체 내의 참조는 null로 설정되고 SoftReference 객체, WeakReferecne 객체 자체는 ReferenceQueue에 enqueue된다. - ReferenceQueue에 enque하는 작업은 GC에 의해 수행
- ReferenceQueue의 poll() 메서드나 remove() 메서드를 이용해 ReferenceQueue에 이들 reference object가 enqueue되었는지 확인하면 softly rechable 객체나 weakly rechable 객체가 GC되었는지를 파악할 수 있고, 이에 따라 관련된 리소스나 객체에 대한 후처리 작업을 할 수 있다.
참조:
https://d2.naver.com/helloworld/329631
스터디 그룹
'코틀린 & Java' 카테고리의 다른 글
[Android] Java Stream에 대해 알아보자 (0) | 2022.10.24 |
---|---|
[Android] 코틀린 확장 함수(kotlin extention)에 대해 알아보자 (0) | 2022.10.05 |
lateinit 초기화 확인하기 (0) | 2022.01.11 |
LiveData와 StateFlow의 차이 (0) | 2021.12.27 |
코틀린 코딩컨벤션 정리 (0) | 2021.12.13 |