일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 합병 정렬
- Switch Expressions
- auto.create.topics.enable
- annotation processor
- 람다식
- 제네릭 타입
- 프리미티브 타입
- 상속
- 바운디드 타입
- yield
- 로컬 클래스
- 자바스터디
- System.err
- 정렬
- 익명 클래스
- junit 5
- 항해99
- 접근지시자
- 함수형 인터페이스
- docker
- 제네릭 와일드 카드
- raw 타입
- System.out
- 스파르타코딩클럽
- github api
- Study Halle
- throwable
- 자바할래
- 브릿지 메소드
- System.in
Archives
- Today
- Total
코딩하는 털보
이펙티브 자바, 아이템 8. finalizer와 cleaner 사용을 피하라 본문
이펙티브 자바, 아이템 8. finalizer와 cleaner 사용을 피하라
자바의 두가지 객체 소멸자 finalizer, cleaner
finalizer (자바9 deprecated)
finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있어서 일반적으로 불필요하다. 기본적으로 쓰지말아야 한다.cleaner
cleaner는 finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다.finalizer와 cleaner의 문제점
- finalizer, cleaner가 예측할 수 없다는 것은, 객체에 접근할 수 없게 된 후 finalizer나 cleaner가 실행되기까지 얼마나 걸릴지 알 수 없다는 것.
즉, finalizer와 cleaner로는 제때 실행되어야 하는 작업은 절대 할 수 없다. - finalizer와 cleaner는 수행 여부를 보장하지 않는다. 객체 종료 작업을 수행하지 못한 채 프로그램이 중단될 수 있다. 때문에 데이터베이스 같이 상태를 영구적으로 수정하는 작업에서는 절대 finalizer나 cleaner에 의존해서는 안된다.
- finalizer는 동작 중에 발생하는 예외를 무시해버린다. 잡지 못한 예외 때문에 객체가 홰손된 상태로 남을 수 있다.
- finalizer와 cleaner는 심각한 성능 문제도 동반한다. finalizer와 cleaner는 가비지 컬렉터의 효율을 떨어뜨린다.
- finalizer를 사용하면 finalizer 공격에 노출되어 심각한 보안 문제를 일으킬 수도 있다.
- finalizer, cleaner가 예측할 수 없다는 것은, 객체에 접근할 수 없게 된 후 finalizer나 cleaner가 실행되기까지 얼마나 걸릴지 알 수 없다는 것.
finalizer와 cleaner의 대안
AutoCloseable을 구현하고 클라이언트에서 인스턴스를 다 쓰고 나면 close 메서드를 호출하는 것(일반적으로 예외가 발생해도 제대로 종료되도록 try-with-resources를 사용)finalizer와 cleaner의 적절한 쓰임새
- 자원의 소유자가 close 메서드를 호출하지 않는 것에 대비한 안전망 역할
- 네이티브 피어와 연결된 객체 회수
- 네이티브 피어 : 일반 자바 객체가 네이티브 메서드를 통해 기능을 위임한 네이티브 객체.
- 네이티브 피어는 가비지 컬렉터가 식별할 수 없다.
핵심 정리
finalizer와 cleaner는 안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로만 사용하자. 하지만 이런 경우라도 불확실성과 성능 저하에 주의해야 한다.
Comments