자바는 두 가지 객체 소멸자를 제공한다.
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 는 자신의 스레드를 통제하기 때문에 이러한 문제는 없다!