- 오작동, 낮은 성능, 이식성 문제의 원인
cleaner : finalizer의 대안, finalizer보다는 덜 위험하지만 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다.
- EX) 데이터베이스 같은 공유 자원의 영구 락 해제 > 분산 시스템 전체가 서서히 멈춘다.
- finalizer는 정적 필드에 자신의 참조를 할당하여 GC가 수집하지 못하게 막을 수 있다.
- 일그러진 객체가 만들어지면, 해당 객체의 메소드를 호출하여 허용되지 않았을 작업을 수행할 수 있게 된다.
- 방어 방법 : 아무 일도 하지 않는 finalizer 메소드를 만들고 final 로 선언한다.
- EX) 자바의 FileInputStream, FileOutputStream, ThreadPoolExecutor
- 자바 객체가 아니므로 GC가 존재를 알지 못한다.
- 성능 저하를 감당할 수 없거나 네이티브 피어가 사용하는 자원을 즉시 회수해야 한다면 close() 메서드를 사용해야 한다.
Reference: