자바는 두 가지 객체 소멸자를 제공한다.
finalizer
deprecated
로 지정되었고, cleaner
가 등장했다.cleaner
<aside>
💡 *finalizer
와 cleaner
의 문제점에 대해 알아보자.*
</aside>
finalizer
와 cleaner
는 즉시 수행된다는 보장이 없다.객체에 접근할 수 없게 된 후 실행되기까지 얼마나 걸릴지 알 수 없다.
finalizer
와 cleaner
로는 제 때 실행되어야 하는 작업은 절대 할 수 없다!finalizer
와 cleaner
에게 맡기면 중대한 오류를 일으킬 수 있다.finalizer
와 cleaner
를 얼마나 신속히 수행할지는 전적으로 가비지 컬렉터 알고리즘에 달려있고, 구현마다 천차만별이다.
finalizer
를 달아두면 그 인스턴스의 자원 회수가 제멋대로 지연될 수 있다.finalizer
스레드가 다른 애플리케이션 스레드보다 우선 순위가 낮아서 실행이 지연되어 OutOfMemorryError
발생!cleaner
는 그나마 자신을 수행할 스레드를 제어할 수 있다.finalizer
나 cleaner
에 의존해서는 안 된다.자바 언어 명세는 finalizer
나 cleaner
의 수행 시점뿐 아니라 수행 여부도 보장하지 않는다!
System.gc
나 System.runFinalization
메서드를 사용하더라도, 실행될 가능성을 높여줄 순 있으나 보장하진 않는다.
finalizer
동작 중 발생한 예외는 무시되며, 처리할 작업이 남았더라도 그 순간 종료된다.finalizer
에서는 경고조차 출력하지 않는다.cleaner
는 자신의 스레드를 통제하기 때문에 이러한 문제는 없다!