[이펙티브 자바] 8. finalizer와 cleaner 사용을 피해라.

초코칩·2024년 4월 3일
0

Java

목록 보기
12/14
post-thumbnail

finalizer와 cleaner의 위험성

Finalizer는 예측할 수 없고, 상황에 딸하 위험할 수 있어 일반적으로 불필요하다. Cleaner는 finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다.

단점

  1. finalizer와 cleaner는 즉시 수행되지 않는다. 따라서 파일 닫기와 같이 바로 실행되어야 하는 작업은 진행될 수 없다.
  2. finalizer와 cleaner의 속도는 GC의 알고리즘에 따라 달렸다. 따라서 수행 시점 또한 영향을 받는다.
  3. finalizer 동작 중 발생한 예외는 무시되며 처리할 작업이 남았더라도 그 순간 종료된다.
  4. finalizer와 cleaner는 AutoClosable에 비해 성능이 50배 느리다.
  5. finalizer를 사용한 클래스는 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수 있다.

대안

finalizer와 cleaner를 대신해줄 묘안은 AutoCloseable이다. AutoCloseable을 구현해주고, 클라이언트에서 인스턴스를 다 쓰고 나면 close 메서드를 호출하면 된다.

finalizer와 cleaner의 실제 용도

  1. 자원의 소유자가 close 메서드를 호출하지 않는 것에 대비한 안전망 역할
  2. 네이티브 피어와 연결된 객체의 정리

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

정리

cleaner(자바 8까지는 finalizer)는 안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로만 사용하자. 물론 이런 경우라도 불확실성과 성능 저하에 주의하자.

profile
초코칩처럼 달콤한 코드를 짜자

0개의 댓글