IT 관련 책 정리 및 후기/Java Effective E3

[Item 8] finalizer와 cleaner 사용을 피하라

JUN0126 2022. 5. 19. 01:48

자바 제공 객체 소멸자

 1. finailzer

 2. cleaner

 

위 두개의 객체 소멸자 사용 시 인스턴스의 자원 회수가 제멋대로 지연될 수 있다.

 

상태를 영구적으로 수정하는 작업에서는 절대 finalizer나 cleaner에 의존해서는 안된다.

 

객체 소멸자 대체 방법

 - AutoCloseable 구현 해주고, 클라이언트에서 인스턴스를 다 쓰고 나면 close 메서드를 호출

 - 일반적으로 예외가 발생해도 제대로 종료되도록 try-with-resources 사용

 

 

 finailzer과 cleaner 활용 방법

 1. 소유자가 close 메서드를 호출하지 않는 것에 대비한 안전망 역할

  - 두 객체 소멸자가 호출 된다는 보장은 없지만, 클라이언트가 하지 않은 자원 회수를 늦게라도 해주는 안정망 역할

 2. 네이티브 피어와 연결된 객체

  - 네이티브 피어란 일반 자바 객체가 네이티브 메서드를 통해 기능을 위임한 네이티브 객체다.

  - 네이티브 피어는 자바 객체가 아니므로 가비지 컬렉터는 그 존재를 알지 못하고 자바 피어를 회수 할때 네이티브 

    피어는 회수하지 못한다. 이때 두 객체 소멸자가 나서서 처리 할 수 있다.

  - 성능 저하를 감당할 수 없거나 네이티브 피어가 사용하는 자원을 즉시 회수해야 한다면 close 메서드를 사용하라

 

 

참조된 ITEM

 - try-with-resources [Item 9]

 - 정적이 아닌 중첩 클래스 참조 [Item 24]