- finalizer와 cleaner 사용을 피하라2021년 03월 28일 22시 34분 05초에 업로드 된 글입니다.작성자: jCurve728x90반응형
finalizer와 cleaner 사용을 피하라
finalizer 와 cleaner는 자바에서 제공하는 두 가지 객체 소멸자로 finalizer는 deprecated되었다.
finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다.
cleaner는 finalizer 보다는 덜 위험하지만 , 여전히 예측할 수 없고, 느려 일반적으로 불필요하다.
자바는 gc가 특정 객체와 관련된 자원을 회수하고 비메모리 자원 또한 try-with-resource를 사용해 회수가 가능한데
finalizer와 cleaner는 객체에 접근할 수 없게 된 후 실행되기까지 얼마나 걸릴지 알 수 가 없다
즉, 제때 실행되어야 하는 작업은 절대 할 수 없다.
finalizer와 cleaner의 수행 시작 속도는 gc 알고리즘에 달렸으면 gc 구현마다 천차 만별이다.
finalizer 스레드는 다른 애플리케이션 스레드보다 우선순위가 낮아 실행될 기회를 제대로 얻지 못한다.
따라서 finalizer를 적용한 인스턴스는 자원 회수가 지연될 수 있다.
finalizer와 cleaner는 수행 시점뿐 안리 수행 여부조차 보장하지 않기 때문에 상태를 영구적으로 수정하는 작업에서 두 함수에 의존한다면 해당 작업의 종료 작업이 제대로 실행되지도 않은채 프로그램이 중단될 수도 있다.
일반적으로 파일이나 스레드 등 종료해야 할 자원을 담고 있는 객체의 클래스에서는 인스턴스를 다 쓰고 close 메서드를 호출하지만 try-with-resource가 가장 좋은 방안이다.
각 인스턴스의 close 메서드에서 해당 객체가 더 이상 유효하지 않은 필드임을 기록하고 객체가 닫힌 후 불렸다면
IllegalStateException을 던지는것이 좋다.
반응형'JAVA' 카테고리의 다른 글
equals는 일반 규약을 지켜 재정의하라 (0) 2021.03.29 try-finally 보다는 try-with-resource를 사용하라 (0) 2021.03.28 다 쓴 객체 참조를 해제하라 (0) 2021.03.28 불필요한 객체 생성을 피하자 (0) 2021.03.15 자원을 직접 명시하지 말고 의존 객체 주입을 사용하자 (0) 2021.03.15 댓글