2장_아이템8 - ririkat/effective-java GitHub Wiki
자바에서 제공하는 객체 소멸자는 2가지가 있다.
자바 제공 객체 소멸자 2가지
-
finalizer
- 예측 불가능
- 상황에 따라 위험
- 오동작, 낮은 성능, 이식성 문제의 원인이 되기도 해 사용 자제로 지정된 기능임.
- 동작 중에 발생한 예외 무시 -> 처리할 작업이 남았더라도 그 순간 종료됨 -> 훼손된 객체를 발생시킴
- finalizer 공격에 노출 되어 심각한 보안 문제 야기 가능성 높음
- finalizer 공격에 노출되는 경우는 생성자나 직력화 과정에서 예외가 발생하는 경우 노출될 수 있음.
-
cleaner
- finalizer의 대안
- finalizer보다 덜 위험
- But, 여전히 예측할 수 없으며, 느리고, 일반적으로 불필요함
또한, finalizer, cleaner는 모두 즉시 수행을 보장하지 않고, 가비지 컬렉터의 알고리즘에 따라 신속성이 달라지기 때문에 성능 문제를 동반할 수 있다. 특히나, 상태를 영구적으로 수정하는 작업에서는 절대 finalizer나 cleaner에 의존해서는 안된다. 결론적으로, finalizer, cleaner의 사용은 피하는 것이 좋다.
-
AutoCloseable 구현 클라이언트에서 인스턴스를 다 쓰고 나면 close 메소드를 호출하면 된다.
➡️ 각 인스턴스는 자신의 상태를 추적하는 것이 좋다.
-
안전망으로 활용
-
네이티브 피어와 연결된 객체에서 사용 네이티브 피어는 자바 객체가 아니므로, 가비지 컬렉터가 그 존재를 알지 못해서 회수를 하지 못함. 이런 경우는 finalizer, cleaner 사용하기 적당한 직업이다.
➡️ 즉시 회수는 close 메소드를 사용해야 한다.