Item8 은 finalizer와 cleaner의 사용을 피하라는 내용입니다.
저같은경우는 2개가 어떤건지 모르지만 이번 기회에 공배해보면서 왜 피하라고 하는지 알아보도록 하겠습니다.
일단 finalizer와 cleaner은 자바에서 제공하는 2가지 객체 소멸자이다.
finalizer or cleaner은 가비지 컬렉션이 진행될때 더 이상 사용하지 않는 자원에 대한 정리작업을 진행하기 위해 사용된다고 한다.
finalizer와 cleaner은 각각의 문제가 있다.
finalizer
cleaner
따라서 해당 finalizer API 는 Java9 버전에서 deprecated API
로 지정되었고 그 대안으로 cleaner가 나왔다. ( 새로 나왔지만 권장하지 않는다 )
1. finalizer와 cleaner로는 제때 실행되어야 하는 작업은 절대 할 수 없다.
파일 닫기를 finalizer와 cleaner에 맡기면 중대한 오류를 일으킬 수 있다.
이유는 시스템이 동시에 열 수 있는 파일 개수에 한계가 있기 때문이다.
시스템이 finalizer나 cleaner가 실행을 게을리 한다면 새로운
파일을 열지 못해 프로그램이 실패할 수 있다.
2. finalizer와 cleaner는 심각한 성능 문제도 동반한다.
테스트시에 AutoCloseable 객체를 생성하고 가비지 컬렉터가 수거하기까지 12ns가
걸린 반면에 (try-with-resources 사용) finalizer를 사용하면 550ns가 걸렸다고 한다.
결과적으로 finalizer를 사용한 객체를 생성하고 파괴하니 50배나 느려졌다는 의미가 된다.
finalizer가 가비지 컬렉터의 효율을 떨어트리기 떄문이다 .
3. finalizer를 사용한 클래스는 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수 있다.
위에서 살펴본 것처럼 finalize 메서드의 실행 시간이
오래 걸리도록 만들면 전반적인 시스템 장애를 불러올 수 있습니다.
메서드를 재정의(override)하여 악의적으로 정상 실행을 방해할 수 있기
때문에 final 키워드를 붙여서 상속하지 못하도록 막아야 합니다.
가비지 컬렉터가 회수하지 못하는 네이티브 자원의 회수용으 사용한다. 왜냐 하면 자바 객체가 아니기 때문에 가비지 컬렉터가 관리하는 대상이 아니기 때문입니다. finalizer를 호출함으로 자원을 회수 할 있다.
책을 보면서도 글로 다 녹아내지 못한점이 많이있습니다. 책으로는 꼭 챙겨보시길 바랍니다.