[자바] 가비지 컬렉션
객체의 도달 가능성
JVM의 가비지 컬렉터는 객체가 가비지인지 아닌지(컬렉션 대상 여부)를 객체의 도달 가능성(reachability) 상태를 기준으로 판별한다. 도달 가능성 상태에는 strong, soft, weak, phantom 네 가지가 있다. 기본적으로 도달 가능한(reachable) 상태는 strong 상태로 간주된다. 로컬 변수와 같이 루트 노드에서 직접 참조되는 객체는 strong 상태이며, strong 상태의 인스턴스 변수에서 직접 참조되는 모든 객체 또한 strong 상태이다. java.lang.ref.Reference
라는 추상 클래스는 strong 상태 외의 객체의 상대적으로 약한 도달 가능성 상태를 표현하기 위한 클래스이며, 각각의 상태에 대응되는 Reference
의 하위 클래스는 SoftReference
, WeakReference
, PhantomReference
이다. 이러한 클래스의 인스턴스를 레퍼런스 객체(reference object)라고 한다. 레퍼런스 객체는 객체의 도달 가능성을 가비지 컬렉터에게 알려주기 위한 목적으로 존재하는, 객체의 도달 가능성 상태 표현을 위한 또다른 객체이다. 객체가 레퍼런스 객체에 의해 참조되면 해당 객체는 참조된 객체(referent)이다. strong 상태와 나머지 세 가지 상태의 차이점은 strong 상태는 레퍼런스 객체가 가비지 컬렉션되는 것을 방지하지만, 세 가지 상태는 그렇지 않다는 점이다.
가비지 컬렉터는 객체의 도달 가능성 상태의 변경을 기록하기 위해 레퍼런스 객체를 레퍼런스 큐(reference queue)에 추가하는 방식으로 관리한다. 레퍼런스 큐는 java.lang.ref.ReferenceQueue
클래스의 인스턴스이다. 가비지 컬렉터가 레퍼런스 객체에 의해 참조된 객체의 도달 가능성 상태를 변경하고 레퍼런스 객체를 관련 레퍼런스 큐에 추가한다. 이때 가비지 컬렉터는 참조된 객체가 soft와 weak 상태를 벗어날 때 레퍼런스 객체를 레퍼런스 큐에 넣는 반면, phantom 상태에 들어갈 때 레퍼런스 객체를 큐에 넣는다. 즉, 가비지 컬렉터가 soft 또는 weak 상태의 레퍼런스 객체를 레퍼런스 큐에 추가한다는 것은 레퍼런스 객체에 의해 참조된 객체가 soft 또는 weak 상태에서 벗어났음을 나타내는 것이며, phantom 상태의 레퍼런스 객체를 레퍼런스 큐에서 제거한다는 것은 참조된 객체가 phantom 상태에 들어갔음을 나타내는 것이다.
참고
- https://d2.naver.com/helloworld/329631
- Inside the Java 2 Virtual Machine (Bill Venners)
Comments