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)는 안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로만 사용하자. 물론 이런 경우라도 불확실성과 성능 저하에 주의해야 한다.
'공부 기록 > Java' 카테고리의 다른 글
[이펙티브 자바 3/E] 아이템10 - equals는 일반 규약을 지켜 재정의하라 (0) | 2023.07.21 |
---|---|
[이펙티브 자바 3/E] 아이템9 - try-finally보다는 try-with-resources를 사용하라 (0) | 2023.07.19 |
[이펙티브 자바 3/E] 아이템7 - 다 쓴 객체 참조를 해제하라 (0) | 2023.07.19 |
[이펙티브 자바 3/E] 아이템6 - 불필요한 객체 생성을 피하라 (0) | 2023.07.06 |
[이펙티브 자바 3/E] 아이템5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2023.07.06 |