try-with-resources
와 try-finally
를 사용해 해결한다.finalizer
객체가 GC에 의해 제거될 때 가장 마지막으로 수행되는 작업
Cleaner
예측 불가능
finalizer와 cleaner는 즉시 수행된다는 보장이 없다.
→ 실행되기까지 얼마나 걸리는 지 알 수 없기 때문
전적으로 GC 알고리즘에 달렸다.
클래스에 finalizer를 달아두면 그 인스턴스의 자원 회수가 제멋대로 지연될 수 있다.
수행 여부를 보장하지 않음
상태를 영구적으로 수정하는 작업에서는 절대 finalizer나 cleaner에 의존하면 안된다.
System.gc
나 System.runFinalization
에 현혹되지 말자
(실행될 가능성을 높여줄 수 있으나, 보장하진 않는다.)
동작하더라도, 실행 중 발생한 예외는 무시되며 처리할 작업이 남았더라도 그 순간 종료된다. 자칫 마무리가 덜 된 상태로 남을 수 있다.