728x90
finalizer와 cleaner 사용을 피하라.
finalizer와 cleaner란?
finalizer
객체가 가비지 컬렉션 대상이 될 때 호출된다.
이는 객체가 더 이상 참조되지 않을 때 호출되는 메서드로, 객체가 소멸되기 전에 정리 작업을 수행할 수 있도록 한다.
cleaner
명시적으로 클리너 작업을 정의하고, 객체가 가비지 컬렉션 대상이 될 때 해당 작업을 실행할 수 있도록 한다.
문제점
- 불확실성: finalize() 메서드가 언제 호출될지 예측할 수 없습니다. 이는 가비지 컬렉터가 객체를 수집할 때 호출되므로, 시점을 예측하기 어렵다.
- 성능 저하: finalize() 메서드는 가비지 컬렉션의 성능을 저하시킬 수 있다.
- 신뢰성 부족: 객체가 여전히 finalize() 메서드가 호출되지 않은 채로 종료될 수 있습니다. 이는 자원 누수로 이어질 수 있다.
1. 즉시 수행된다는 보장이 없다.
- finalize나 cleaner에서 사용되는 레퍼런스 큐는 우선순위가 낮기 때문에 즉시 수행된다는 보장이 없다.
2. 실행되지 않을 수도 있다.
- 1번과 같다.
3. 동작 중에 예외가 발생하면 정리 작업이 처리되지 않을 수도 있다.
- finalize에서 uncheked Exception이 발생한다면, finalize에 구현한 로직들은 무시된다.
4. 성능에 문제가 있다.
- gc 과정에서 수행하기 때문에 성능 저하가 발생할 수 있다다.
- gc의 포인트는 stop the world를 줄이기 위함인데, gc과정 중 finalize 메서드의 할 일이 늘어나면, 전체적인 성능 저하가 일어날 수 있다.
해결 방법
자원 반납이 필요한 클래스에 AutoCloseable 인터페이스를 구현하고 try-with-resources를 사용한다.
클라이언트가 close 메소드를 명시적으로 호출한다.
finalizer와 cleaner 쓰임새
1. 안전망
클라이언트가 close 메서드를 호출하지 않으면 자원 회수가 되지 않을것이므로,
그럴 경우에 대비한 안정망 역할로 사용하는 것이다.
2. 네이티브 피어와 연결된 객체일 때
네이티브 피어란?
- 일반 자바 객체가 네이티브 메서드를 통해 기능을 위임한 객체
- 자바 객체가 아니므로 가비지 컬렉터가 회수 못함
가비지 컬렉터가 회수 못하니까 사용하기 좋다.
728x90
'EFFECTIVE JAVA' 카테고리의 다른 글
EFFECTIVE JAVA TIL 11 - 모든 객체의 공통 메서드 / 아이템 11 (0) | 2024.08.02 |
---|---|
EFFECTIVE JAVA TIL 10 - 모든 객체의 공통 메서드 / 아이템 10 (0) | 2024.08.02 |
EFFECTIVE JAVA TIL 07 - 객체 생성과 파괴 / 아이템 7 (2) | 2024.07.25 |
EFFECTIVE JAVA TIL 06 - 객체 생성과 파괴 / 아이템 6 (0) | 2024.07.25 |
EFFECTIVE JAVA TIL 05 - 객체 생성과 파괴 / 아이템 5 (0) | 2024.07.25 |