심지어 finalizer는 자바9부터 deprecated 되었다...그래도 일단 알아보자.
finalizer와 cleaner란?
➡️ 자바가 제공하는 두가지 객체 소멸자이다.
- 예측할 수 없다.
- 수행하는 스레드가 즉시 수행된다는 보장이 없다.
- 내가 원하는 타이밍에 작업을 절.대.로 수행할 수 없다.
- 느리다.
try-with-resource
로 GC가 객체를 수거하기까지 12ns 소요finalizer
는 550ns 소요cleaner
는 500ns 소요
- 일반적으로 불필요하다.
- 우리에겐 GC와
AutoCloseable
이 있다!
- 우리에겐 GC와
- 안전망 역할
즉시 호출된다는 보장이 없지만.. 언젠간 호출되니까...^^
- 정도의 생각을 갖고 사용해야 한다. 절대 객체의 소멸을 맡기면 안된다.
- 네이티브 피어와 연결된 객체에서 사용
- 네이티브 피어란, C/C++로 작성된 프로그램을 Java의 Native API를 통해 연관된 객체를 의미한다.
- 결국 네이티브 피어는 자바 객체가 아니기때문에 GC가 자원을 회수할 수 없다. ➡️ 하지만 두가지 경우 모두 성능 저하 감당을 할수 있고, 해당 자원이 중요하지 않을 때 사용하자.
- 사용하지 말자.
- 네이티브 피어의 경우 성능 저하를 감당하겠다면, 도입을 고려해볼 수 있다.
참고
- finalize 코드로 이해해보기: https://www.baeldung.com/java-finalize