8. finalizer 와 cleaner 사용을 피하라

신명철·2022년 2월 10일
0

Effective Java

목록 보기
7/80

객체 소멸자

메모리 관리에 대해서 언급했으니 이번에는 객체 소멸자에 대해서 알아보자.

finalizer

예측할 수 없고, 상황에 따라 위험할 수 있다.

cleaner

finalizer의 대안이지만 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다.

사용을 피해야 하는 이유

  • 즉시 실행하지 않는다.
    • 실행되기까지 얼마가 걸릴지 알 수 없다.
  • 실행 여부를 보장하지 않는다.
    • 영구적으로 수정하는 작업에 사용할 수 없다
  • finalizer 작업 중 발생하는 예외는 무시된다.
  • 성능적인 문제가 있다.
  • finalizer 공격에 노출되어 보안 문제가 발생할 수 있다.
    • 생성되다 만 객체가 만들어져 GC 가 수집할 수 없게 된다.

대안

AutoCloseable

AutoCloseable 을 구현하고 close() 를 호출하는 방법으로 자원을 종료시킬 수 있다.

finalizer, cleaner 의 사용

1. close() 의 안전망

close() 를 호출하지 않는 경우 늦게라도 자원을 회수하는 것이 낫기 때문에 안전망 역할로 사용할 수 있다.

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

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

네이티브 피어 는 자바 객체가 아니기 때문에 CG 로 관리할 수 없다. 하지만, close() 도 사용이 가능하기 때문에 이를 고민해서 사용하면 된다.

단, 네이티브 피어가 심각한 자원을 가지고 있지 않고 성능 저하를 감당할 수 있을 때에만 해당된다.

profile
내 머릿속 지우개

0개의 댓글