Skip to content

Latest commit

 

History

History
33 lines (27 loc) · 1.63 KB

08.finalizer와 cleaner 사용을 피하라. (그냥 쓰지마라).md

File metadata and controls

33 lines (27 loc) · 1.63 KB

08.finalizer와 cleaner 사용을 피하라. (그냥 쓰지마라)

심지어 finalizer는 자바9부터 deprecated 되었다...그래도 일단 알아보자.

finalizer와 cleaner란?
➡️ 자바가 제공하는 두가지 객체 소멸자이다.

왜 사용하면 안되는가?

  1. 예측할 수 없다.
    • 수행하는 스레드가 즉시 수행된다는 보장이 없다.
    • 내가 원하는 타이밍에 작업을 절.대.로 수행할 수 없다.
  2. 느리다.
    • try-with-resource 로 GC가 객체를 수거하기까지 12ns 소요
    • finalizer는 550ns 소요
    • cleaner는 500ns 소요
  3. 일반적으로 불필요하다.
    • 우리에겐 GC와 AutoCloseable이 있다!

그럼 대체 어디에 사용되는가? 🤔

  • 안전망 역할

    즉시 호출된다는 보장이 없지만.. 언젠간 호출되니까...^^

    • 정도의 생각을 갖고 사용해야 한다. 절대 객체의 소멸을 맡기면 안된다.
  • 네이티브 피어와 연결된 객체에서 사용
    • 네이티브 피어란, C/C++로 작성된 프로그램을 Java의 Native API를 통해 연관된 객체를 의미한다.
    • 결국 네이티브 피어는 자바 객체가 아니기때문에 GC가 자원을 회수할 수 없다. ➡️ 하지만 두가지 경우 모두 성능 저하 감당을 할수 있고, 해당 자원이 중요하지 않을 때 사용하자.

결론

  • 사용하지 말자.
  • 네이티브 피어의 경우 성능 저하를 감당하겠다면, 도입을 고려해볼 수 있다.

참고