아이템 8 - finalizer와 cleaner 사용을 피하라
JAVA
·
finalizer와 cleaner 사용을 피해야 하는 이유
- finalizer와 cleaner는 즉시 수행된다는 보장이 없다.
- 신속히 수행할 지는 전적으로 가비지 컬렉터 알고리즘에 달렸다.
- finalizer와 cleaner는 실행되지 않을 수도 있다.
- System.gc나 System.runFinalization 메서드는 실행 가능성을 높여줄 수 있으나 보장 X
- finalizer 동작 중에 예외가 발생하면 정리 작업이 처리되지 않을 수도 있다.
- finalizer와 cleaner는 심각한 성능 문제가 있다.
- AutoCloseable 객체와 비교했을 때, 50배나 느리다.
- finalizer를 사용한 클래스는 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수 있다.
- finalizer 공격 원리는 생성자나 직렬화 과정에서 예외가 발생하면, 이 생성되다 만 객체에서 악의적인 하위 클래스의 finalizer가 수행될 수 있게 되는 것
- 방어 방법은 final 클래스로 만들거나 아무 일도 하지 않는 finalize 메서드를 만들고 final로 선언하는 것
- 그래서 finalizer는 자바 9에서 deprecated API로 지정
</br>
</br>
해결방안
- 반납할 자원이 있는 클래스는 AutoCloseable을 구현하고 클라이언트에서 close를 호출하거나 try-with-resource를 사용해야 한다.
- cleaner(자바 8까지는 finalizer)는 안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로만 사용하자. 물론 이런 경우라도 불확실성과 성능 저하에 주의해라.
출처
이펙티브 자바 3/E
이펙티브 자바 완벽 공략 1