공부

Garbage Collection(4) - Weak Reference

프로필사진
fienestar
2023. 1. 16. 08:02

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 에서 보실 수 있습니다.