본문
java.lang.ref #4. Finalizer 입장에서의 객체 상태
Finalizer의 입장에서, 모든 객체는 reachability와 finalization 두개의 성질로 표현될 수 있다.
Reachability
- reachable : 살아 있는 쓰레드들에 의해 지속적으로 접근될 수 있는 객체의 상태. 프로그램의 최적화는 이런 reachable한 객체의 숫자를 줄이는 방향으로 나갈 수 있다. 예를 들어, 사용자가 명시적으로 하지 않았더라도 컴파일러나 코드 생성기가 더 이상 사용되지 않을 객체의 레퍼런스에 대해 미리 null이라고 세팅함으로써, 빠른 시간 내에 가비지 수집이 될 수 있게 하는 것이다.
- finalizer-reachable : 현재 살아있는 쓰레드들에 의해 참조되지는 않으나, finalizable한 객체들에 의해 참조되고 있는 객체의 상태.
- unreachable : 어떠한 객체들로부터도 참조되지 않는 객체.
Finalization
- unfinalized : 파이널라이저가 자동으로 수행되지 않은 객체의 상태.
- finalizable : 파이널라이저가 자동으로 수행되지 않은 상태이지만, 자바 가상 머신이 언제라도 파이널라이저를 수행할 수 있는 객체의 상태. 즉 파이널라이저에 의해서는 참조가 되고 있는 상태
- finalized : 파이널라이저가 자동으로 수행된 객체의 상태.
이와 같은 두 애트리뷰트의 부류를 고려한 객체의 라이프 사이클은 다음과 같다. (finalizer-reachable은 f-reachable으로 적는다)
(A) : 객체가 처음 생성되었을 때에는 reachable이면서 unfinalized한 상태이다
객체의 참조가 프로그램의 실행 도중에 살아 있는 쓰레드로부터 접근할 수 없게 되면서 객체의 상태는 finalizer-reachable(B,C,D)나 unreachable(E,F)의 상태가 된다. 이 그림에서 주의깊게 봐야 할 것은 f-reachable한 상태에서 직접 unreachable한 상태로 이동하지는 않는다는 것이다. 파이널라이저가 수행시작되는 순간 reachable한 상태가 되면서 unreachable상태로 이동하게 되는 것이다.
(G,H) : unfinalized상태의 객체가 f-reachable이나 unreachable상태가 된 것을 자바 가상 머신이 탐지하고 finalizable이라는 상태로 세팅한다. 그리고, 그 객체가 unreachable 상태라면 f-reachable상태로 바꾸어 파이널라이저가 수행될 수 있도록 한다.
(I) : 파이널라이저가 수행되었고 unreachable이면 이 객체는 메모리로부터 제거된다.
(J,K) : 자바 가상 머신은 finalizable한 객체에 대해서는 임의의 쓰레드를 이용해 파이널라이저를 수행시킬 수 있다. 이 경우에 객체는 finalized이면서 reachable한 상태가 된다.
(L,M,N) : 위와 같은 작업에 의해 f-reachable이었던 다른 객체들의 상태가 reachable해지게 될 수도 있다.
위에서 한 가지 상태가 빠져 있다. finalizable이면서 unreachable한 상태로 이런 상태는 있을 수 없다. finaliable한 객체는 파이널라이저에 의해 접근될 수 있기 때문이다.
(O) : 파이널라이저가 정의되지 않은 사용자 클래스의 경우 굳이 복잡한 상태를 거칠 이유가 없다.
================
The Java Language Specification Second Edition의 12.6.1 Implementing Finalization 페이지에서 그림을 옮겨 왔으며, 특히 한글 부분은 동일한 내용을 요약한 'finalize method란 무엇인가?' 에서의 번역을 가져오고 보완하였다. 참고로 이후에 나온 The Java Language Specification Java SE 7 Edtion에는 그림을 포함한 위의 자세한 내용이 생략되어있다.
댓글