[Item8] finalizer와 cleaner사용을 피하라

윤들윤들·2020년 12월 11일
0

EffectiveJava

목록 보기
8/17
post-thumbnail

Item8 은 finalizer와 cleaner의 사용을 피하라는 내용입니다.

저같은경우는 2개가 어떤건지 모르지만 이번 기회에 공배해보면서 왜 피하라고 하는지 알아보도록 하겠습니다.

일단 finalizer와 cleaner은 자바에서 제공하는 2가지 객체 소멸자이다.

finalizer or cleaner은 가비지 컬렉션이 진행될때 더 이상 사용하지 않는 자원에 대한 정리작업을 진행하기 위해 사용된다고 한다.

finalizer와 cleaner은 각각의 문제가 있다.


finalizer

  • 예측할 수 없다, 상황에 따라 위험할 수 있어 일반적으로 불필요하다.
  • 오동작, 낮은 성능, 이식성 문제의 원인이 되기도 한다. 쓰임새가 있긴 하지만 기본적으로 쓰지 말아야 한다 .

cleaner

  • finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고 느리고 , 일반적으로 불필요 하다 .

따라서 해당 finalizer API 는 Java9 버전에서 deprecated API

로 지정되었고 그 대안으로 cleaner가 나왔다. ( 새로 나왔지만 권장하지 않는다 )


왜 API 사용을 지양하라고 하는것일까

1. finalizer와 cleaner로는 제때 실행되어야 하는 작업은 절대 할 수 없다.

파일 닫기를 finalizer와 cleaner에 맡기면 중대한 오류를 일으킬 수 있다.
이유는 시스템이 동시에 열 수 있는 파일 개수에 한계가 있기 때문이다.
시스템이 finalizer나 cleaner가 실행을 게을리 한다면 새로운
파일을 열지 못해 프로그램이 실패할 수 있다.

2. finalizer와 cleaner는 심각한 성능 문제도 동반한다.

테스트시에 AutoCloseable 객체를 생성하고 가비지 컬렉터가 수거하기까지 12ns가
걸린 반면에 (try-with-resources 사용) finalizer를 사용하면 550ns가 걸렸다고 한다.
결과적으로 finalizer를 사용한 객체를 생성하고 파괴하니 50배나 느려졌다는 의미가 된다. 
finalizer가 가비지 컬렉터의 효율을 떨어트리기 떄문이다 .

3. finalizer를 사용한 클래스는 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수 있다.

 위에서 살펴본 것처럼 finalize 메서드의 실행 시간이
 오래 걸리도록 만들면 전반적인 시스템 장애를 불러올 수 있습니다. 
 메서드를 재정의(override)하여 악의적으로 정상 실행을 방해할 수 있기
 때문에 final 키워드를 붙여서 상속하지 못하도록 막아야 합니다.

참고한 사이트


지양하라고 하는데 도대체 왜 사용할까??

가비지 컬렉터가 회수하지 못하는 네이티브 자원의 회수용으 사용한다. 왜냐 하면 자바 객체가 아니기 때문에 가비지 컬렉터가 관리하는 대상이 아니기 때문입니다. finalizer를 호출함으로 자원을 회수 할 있다.

책을 보면서도 글로 다 녹아내지 못한점이 많이있습니다. 책으로는 꼭 챙겨보시길 바랍니다.

profile
Front&BaackEnd를 재미있게 공부하고싶은 개발자 YundleYundle

0개의 댓글