본문 바로가기

공부 기록/Java

[이펙티브 자바 3/E] 아이템8 - finalizer와 cleaner 사용을 피하라

finalizer와 cleaner

- 예측할 수 없고, 느리고, 일반적으로 불필요하다.

- 즉시 수행된다는 보장이 없다. => 즉, 제때 실행되어야 하는 작업을 절대 할 수 없다.

- 심각한 성능 문제도 동반한다.

- finalizer를 사용한 클래스는 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수도 있다.

- 자바 언어 명세는 finalizer와 cleaner의 수행 시점뿐 아니라 수행 여부조차 보장하지 않는다.

===> 상태를 영구적으로 수정하는 작업에서는 절대 finalizer나 cleaner에 의존해서는 안 된다.


finalizer와 cleaner를 대신해줄 묘안

- AutoCloseable을 구현하고, close 메서드를 호출한다.(일반적으로 예외가 발생해도 제대로 종료되도록 try-with-resources를 사용해야 한다.(아이템 9))


finalizer와 cleaner를 사용하는 경우

1. 자원의 소유자가 close 메서드를 호출하지 않는 것에 대비한 안전망 역할

2. 네이티브 피어(native peer)와 연결된 객체 => 가비지 컬렉터는 그 존재를 알지 못하여 회수하지 못한다.

* 네이티브 피어 : 일반 자바 객체가 네이티브 메서드를 통해 기능을 위임한 네이티브 객체


[핵심 정리]

cleaner(자바 8까지는 finalizer)는 안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로만 사용하자. 물론 이런 경우라도 불확실성과 성능 저하에 주의해야 한다.