'2007/11'에 해당되는 글 1건

  1. 2007/11/30 GC와 finalize()





GC와 finalize()

2007/11/30 12:21

자바에서는 메모리의 해제를 위해 GC(가비지 콜렉터)를 사용한다.

GC는 인스턴스들을 검사하여, 해당 인스턴스가 사용되지 않는 ( 참조가 없는 ) 인스턴스라면 인스턴스를 삭제하여 메모리를 확보한다. ( GC 메커니즘에 대해서는 http://j2eestudy.co.kr/lecture/lecture_read.jsp?db=lecture0401_1&table=j2ee&id=1 에 정말 잘 정리 되어 있다. )

여기서 얘기 하고 싶은건 바로 finalize 메소드다.

java.lang.Object 에 보면 protected void finalize() 메소드가 있다.
protected는 하위클래스에서 상속받고 사용할 수 있다.
그런데 자바에서 java.lang.Object를 상속받지 않는 클래스는 없으므로, 모든 클래스에서 사용가능하다고 보면 될것같다.

finalize 메소드의 역할은 API에서 다음과 같이 소개하고 있다.
"Called by the garbage collector on an object when garbage collection determines that there are no more references to the object." 
쉽고 짧게 한글로 말하면 GC가 삭제하려고 할 때 실행 되는 메소드다.

즉, 인스턴스가 사라지기 전에 마지막으로 실행 되는 메소드 인것이다.

설명을 듣는 순간 뭔가 떠오르는것이 있지 않는가?
맞다. DB나 Socket등 Connectivity Resource를 해제할 때 사용하면 좋을것 같다는 생각이 문득 스쳐지나간다.

그러나, 여기에는 큰 함정이 숨어있다.
바로 GC가 함정이다. finalize 메소드가 GC에서 해당 인스턴스를 가비지로 판단해서 수집해서 삭제하기 전에 실행된다. 즉, GC에 의해서 수집이 되어야 호출 되는 메소드라는 것이다.

어떤 인스턴스가 참조가 없다고 하더라도, 언제 GC에 수집되어 질지는 전혀 모른다.
바로 될수도~ 한참 뒤에 될수도~ 언제 될지는 알수가 없다. VM도 모르고, OS도 모른다.

finalize메소드에 리소스 릴리즈 코드가 있으면, 언제 해당 리소스가 릴리즈 될지는 모른다는 거다.

이런 문제 때문에 finalize 에는 리소스의 릴리즈 코드를 사용하지 못한다. 물론, 웹처럼 동적이고 빠른 환경이 아니라 제한적인 환경에서의 작업이라면 가능할지도 모르겠다....

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 가이던스





BLOG main image
Direction
내 삶의 목표, 방향 by 가이던스

공지사항

카테고리

분류 전체보기 (8)
android (0)
Java (8)
기타 (0)

글 보관함

달력

«   2007/11   »
        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  
Total : 15,655
Today : 1 Yesterday : 10