이펙티브 자바 2장 Item8를 요약한 내용입니다.
자바는 finalizer와 cleaner라는 객체 소멸자를 제공한다.
finalizer와 cleaner은 많은 문제를 야기하므로 특정 상황을 제외하곤 사용하지 않는다
1. 즉시 수행된다는 보장이 없다.
언제 수행될지는 가비지 컬렉터 알고리즘에 달려있다.
2. 수행 여부조차 보장하지 않는다
System.gc나 System.runFinalization 메서드는 실행가능성을 높여주지만 실행을 보장하진 않는다
이들의 실행을 보장하는 System.runFinalizersOnExit와 Runtime.runFinalizerOnExit가 있지만 심각한 결함이 존재한다
3. finalizer 동작중 예외 발생시 종료되고, 예외는 무시된다
객체를 소멸하는중에 종료되었으므로 객체는 훼손되고 다른 스레드가 이를 사용할수도 있다
4. 가비지 컬렉터의 효율 감소
AutoCloseable 객체를 try-with-resources로 생성한 경우보다 finalizer를 사용한 경우가 50배나 더 느렸다
5. finalizer 공격에 노출
finalizer 공격이란 (이해못함)
finalizer 공격을 막기 위해서는 클래스를 final로 만들거나 아무일도 하지 않는 final인 finalize 메서드를 선언한다.
AutoCloseable을 구현하고 사용 후 close 메서드를 호출한다
예외가 발생되어도 제대로 종료되도록 try-with-resources를 사용한다.
close메서드에서 이 객체는 더이상 유효하지 않음을 필드에 기록하고, 만약 객체가 닫힌 후에 객체가 호출되면 IllegalStateException을 던지도록 한다.
1. 자원의 소유자가 close 메서드를 호출하지 않는 것을 대비한 안전망
반드시 종료해야하는 자원은 cleaner나 finalizer을 사용해 2중으로 종료한다
2. 중요하지 않은 네이티브 피어의 자원을 회수할 때
네이티브 피어란 일반 자바객체가 네잍티브 메서드를 통해 기능을 위임한 네이티브 객체이다
네이티브 피어는 가비지 컬렉터가 그 존재를 모르기때문에 자바 피어를 회수할때까지 네이티브 객체를 회수하지 못한다.
단, 네이티브 피어의 자원을 즉시 회수해야하는 경우 close 메서드를 사용해야 한다
[이펙티브 자바] Item 10. equals는 일반규약을 지켜 재정의하라 | 3장 (0) | 2023.04.26 |
---|---|
[이펙티브 자바] Item 9. try-finally 보다 try-with-resources를 사용하라 | 2장 (0) | 2023.04.12 |
[이펙티브 자바] Item 7. 다 쓴 객체 참조를 해제하라 | 2장 (0) | 2023.04.05 |
[이펙티브 자바] Item 6. 불필요한 객체 생성을 피하라 | 2장 (0) | 2023.04.05 |
[이펙티브 자바] Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 | 2장 (0) | 2023.04.05 |