finalize 메소드의 오버라이딩을 자제해야 하는 이유.



모든 자바 클래스의 최상위 부모클래스인 java.lang.Object 클래스에는 finalize() 메소드가 존재하며,
Java API 에는 이 메소드는  '가비지 컬렉터가 레퍼런스를 잃은 클래스의 인스턴스를 가비지 컬렉션할 때 호출된다'
라고 기술하고 있습니다.

이 메소드는 객체인스턴스가 가비지 콜렉션에 의해 소멸되는 시점에 특정한 동작을 수행해야 할때도 요긴하게
사용할 수 있는 메소드입니다만 일반적인 경우 불필요하게 이 finalize() 메소드를 오버라이딩하는 것은 자제해야합니다.

이유는 'finalize 메소드에 의한 Collection 지연과 OOME(Out of Memory Exception)발생 가능성'
때문입니다.
특정 Class에 finalize 메소드가 정의되어 있는 경우, 이 Class Type의 Object는 Garbage Collection 발생시
즉각적으로 Collection 되지 않습니다. 대신 Finalization Queue에 들어간 후 Finalizer에 의해 정리가 되는데요.
Finalizer는 Object의 finalize 메소드를 실행한 후 메모리 정리 작업을 수행하게됩니다.
만일 finalize 메소드를 수행하는데 오랜 시간이 걸린다면 그 만큼 객체가 오랫동안 메모리를 점유하게 되고
이로 인해 OOME가 발생할 확률이 높아집니다.
이런 이유로 finalize 메소드는 되도록 사용하지 말아야 합니다.

이 글의 관련글
  • TortoiseCVS 사용 시 Disk IO 성능 향상
  • SCJP 5.0 인증 시험 시뮬레이터
  • Java Blueprints web application layout 과 Jakarta web application layout의 차이
  • 자바 파일복사 코드와 성능 1. :: Java File Copy Code & Perfomance Issue. part 1 (4)
  • ANT 를 이용한 RMI 컴파일 ( rmic 로 stub 생성하기 )
  • 자바 애플리케이션에서 동적으로 PDF 파일 생성하기
  • Struts File Upload
  • Struts 2.1 + ajax 플러그인 : dojo툴킷 이용 방법 변경
  • JAVA Base64 Encoding / Decoding
  • 2008/11/06 11:08 2008/11/06 11:08
    Trackback Address:http://www.yunsobi.com/blog/trackback/429
    [로그인][오픈아이디란?]