Garbage Collector
가 존재하는 언어중 몇몇은 약한 참조(Weak Reference
)라는 것을 제공합니다.
일반적으로, 참조당하고 있는 객체는 Garbage Collection
대상이 아닙니다. 하지만 캐시와 같이 속도 면에서는 중요하지만 제거해도 괜찮은 객체는 어떻게 할까요?
이를 위해 Reference Object
를 제공합니다. Reference Object
를 통해 객체를 간접적으로만 참조하는 방식으로 사용하며, GC는 메모리가 부족하면 Reference Object
으로만 참조중인 객체를 제거할 수 있습니다. 따라서 일반적으로는 다음과 같이 접근합니다.
var weakRef = new WeaKReference(new T());
... // 객체는 언제든 제거될 수 있습니다.
T ref = weakRef.get();
if(ref != null){
... // Reference Object와 무관하게 참조중이므로, 절대 제거되지 않습니다.
}
특히 자바는 이를 우선순위에 따라 참조 수준을 다음과 같이 나눕니다.
- Strongly Reachable = Reference Object없이도 스레드에서 직간접적인 참조가 존재하는 경우
- Softly Reachable
- Weakly Reachable
- Phantom Reachable
- Unreachable = 아무런 참조가 없는 경우,
garbage
제거 우선순위는 아래로 갈수록 높아지며, Strongly Reachable
은 제거되지 않습니다.
참조 수준은 참조가 이어지는 경우 그 중 우선순위가 높은 것이며
thread.strong.soft.weak -> Weakly Reachable
thread.soft.weak -> Weakly Reachable
병렬인 경우 그 중 가장 낮은 것입니다
thread.weak & thread.soft -> Softly Reachable
- A: Softly Reachable
- B: Weakly Reachable
- A: Weakly Reachable
- B: Weakly Reachable
- A: Weakly Reachable
- B: Strongly Reachable
* 2021년 동아리 세미나에서 발표한 자료를 글로 다시 정리한 것입니다.
* 발표 ppt는 https://fienestar.github.io/ppt/java-gc 에서 보실 수 있습니다.
'공부' 카테고리의 다른 글
java의 field 초기화와 동시성 (0) | 2023.06.15 |
---|---|
Garbage Collection(3) - Java GC Tuning (0) | 2023.01.16 |
Garbage Collection(2) - Java GC (0) | 2023.01.16 |
Garbage Collection(1) - 탈출 분석과 참조 카운팅, 추적 (1) | 2023.01.16 |
JS - Tag Function (0) | 2022.11.02 |