[Effective Java 3/e] 아이템 8 - finalizer와 cleaner 사용을 피하라


아이템 8 - finalizer와 cleaner 사용을 피하라

  • finalizer 는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요
    • 대안으로 cleaner 사용
  • cleaner 는 finalizer 보다 덜 위험하지만, 여전히 예측할 수 업속, 느리고, 일반적으로 불필요
  • finalizer와 cleaner로는 제때 실행되어야 하는 작업은 절대 할 수 없다.
    • 수행 시점 뿐 아리나 수행 여부조차 보장하지 않는다.
    • 다른 애플리케이션 스레드보다 우선 순위가 낮음
  • 자원 회수는 try-with-resources 사용이 안전

finalizer 와 cleaner 의 쓰임새

  • 자원의 소유자가 close 메서드를 호출하지 않는 것에 대비한 안전망 역할
    • ex) FileInputStrem, FileOutputStrem, ThreadPoolExecutor
  • 네이티브 피어(native peer)와 연결된 객체
    • 네이티브 피어 - 일반 자바 객체가 네이티브 메서드를 통해 기능을 위임한 네이티브 객체
    • 네이티브 피어는 자바 객체가 아니여서 자바 피어를 회수 할 때 네이티브 객체까지 회수 하지 못한다. -> cleaner, finalizer 사용하기 적당한 작업
      • 성능 저하를 감당할 수 있고 네이티브 피어가 심각한 자원을 가지고 있지 않을 때만 해당
      • 네이티브 피어가 사용하는 자원을 즉시 회수해야 한다면 close 메서드 사용