본문

java.lang.ref #1. Object Reachability란?

* 이어지는 글인 'java.lang.ref #2. Garbage Collection과 Reference Object/Queue'와 함께 보시면 더욱 좋습니다.



객체(Object)를 가리키는 Java의 참조(Reference)는 다음과 같이 4개의 종류로 나뉠 수 있다. StrongReference, SoftRerefence, WeakReference, PhantomReference. 이중에서 StrongReference는 일반적으로 사용하는 참조를 의미하고, 나머지 셋은 java.lang.ref 패키지에 수록되어있는 각 클래스를 통한 참조를 의미한다. 뒤로 갈수록 GC(garbage collector)에 대한 피동성? 이 증가하여 더 빠른시간내에 메모리에서 사라질(반환, reclaimed) 가능성이 높다. 우선 이들은 다음과 같이 사용될 수 있다(Reference 클래스는 위 세 클래스가 구현해해는 추상클래스이다)


Reference ref=new SoftReference(obj);

Object refObj=ref.get();

if(refObj==null) //이미 GC 처리가 완료된 경우


이들에 대한 설명에 앞서, Object Reachability에 대해 알아보자. Strongest에서 Weakest로 갈수록, Garbage Collection과의 관계가 깊어진다. 여러 참조(reference)가 있는 경우 가장 강한 참조가 객체(object)에 대한 강약을 결정한다. 그리고 단일 경로를 갖는 경우, 참조 루트(root set of reference=GC root)로부터 객체에 이르는 경로상에서 가장 약한 참조로 세기가 결정된다. 아래는 'Package java.lang.ref'페이지의 내용을 한글로 옮겨오고, 거기에 살을 덧붙인 것이다.


  • Strongly Reachable : 스레드 상에서 참조를 통해 접근할 수 있는 경우이다. 새로 만들어진 객체는 이를 생성한 스레드에 대해 strongly reachable하다. 하나 이상의 strong reference를 사용하여 참조 루트로부터 접근할 수 있는 객체 혹은 참조 루트상에 있는 객체를 지칭하며, 이러한 객체들은 모든 strong reference들이 null 이 되거나(or/and) 참조 루트에 계속 남아있게 될 때에만 GC가 된다. 따라서 메모리 누수는 직접 탐지되어야 한다. 
  • Softly Reachable : 'not strongly reachable'하지만, soft reference로 도달할 수 있는 경우이다. GC가 동작하는 상황이더라도, 메모리가 부족한 경우에만(OutOfMemoryError와 같은경우) 반환 된다.
    => 메모리를 고려한 캐시 구현에 사용된다. (Soflty Reachable의 경우도 clear 되는 경우 finalization의 대상이 된다.)
  • Weakly Reachable : 'neither strongly nor softly reachable'하지만, weak reference로 도달 할 수 있는 경우이며, weakly-reachable object에 대한 weak reference가 clear되는 경우, 객체는 finalization의 대상이 된다. "이때에는 GC의 활동에 어떠한 영향을 미치지 못한다. 즉, GC가 실행된다면 바로 수거된다" 
    => 객체가 반환 되는것을 막지 않으므로, canonicalizing mappings을 구현하는데 사용된다.(정확한 의미를 전달하긴 힘들지만, 주로 IO의 다중처리를 위한 Collection 계열의 값으로 사용된다. - 따로 IO처리 이후에 Collection상에서 처리를 해줄 필요가 없도록)
  • Phantom Reachable : 'neither strongly, softly, nor weakly reachable' 객체는 finalize가 실행되었으며, phantom reference가 이를 가리키고 있는 경우이다. 따라서 PhantomReference에서 get()을 호출하더라도 객체를 얻을수는 없다. 자바의 finalization 메카니즘보다 더 유연한 사전분석 처리 과정(pre-mortem cleanup actions)에 사용된다.
    => 객체가 사라지고 있는 상태을 가리하며, 이때 해당 객체 내부의 객체들에 대해서 처리하고 싶을 경우 사용한다.
  • Unreachable : "therefore eligible for reclamation, when it is not reachable in any of the above ways."


[그림 1] Adding reference objects to the heap, 출처 : Reference Objects and Garbage Collection


참고 : Java theory and practice: Plugging memory leaks with weak references



==========

제목을 자바 메모리 누수 등으로 잡고 글의 범위를 넓혀가고 싶지만 왠지 그러면 주체가 바뀔 것 같아서 우선 이렇게 적어본다. 이 다음 글은 위 글에 대한 상세한 사항과 이어서 자바의 객체 상태, garbage collector의 구현 원리에 대해 다룰 예정이다.

댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.