자바

JAVA 자바 Object 클래스 객체 소멸자 finalize()

알통몬_ 2017. 3. 14. 10:15
반응형

객체 소멸자 finalize()

 참조하지 않는 배열이나 객체는 Garbage Collector 가 힙 영역에서 자동적으로 소멸시킵니다. 

Garbage Collector는 객체를 소멸하기 직전에 마지막으로 객체 소멸자 finalize()를 실행 시킵니다. 

소멸자 : Object의 finalize() 메서드.

기본적으로 실행 내용이 없습니다. 

객체가 소멸되기 전에 마지막으로 사용했던 자원(데이터 연결, 파일 등)을 

닫고 싶거나 중여한 데이터를 저장하고 싶다면 Object의 finalize()를 재정의할 수 있습니다.

예제)

public class Counters {

private int no;

public Counters(int no) {

this.no = no;

}

@Override

protected void finalize() throws Throwable { // finalize()를 오버라이딩

System.out.println(no + "번 객체의 finalize()가 실행됨");

}

 

}


실행 클래스

public class FinalizeExample {

public static void main(String[] args) {

Counters counter = null;

for(int i=1; i<=50; i++) {

counter = new Counters(i);

counter = null; // counter 객체를 쓰레기로 만듭니다.

System.gc(); // Garbage Collector  실행을 요청합니다.

}

}

}

무작위로 소멸되는 것을 볼 수 있을 것입니다. 

전부 소멸되는 것이 아니라 메모리의 상태를 보고 일부만 소멸시킵니다. 

예제에서는 System.gc()로 Garbage Collector를 실행 요청했지만, 

Garbage Collector는 메모리가 부족할때 ,  CPU가 한가할 때에 JVM에 의해 자동적으로 실행.

finalize() 메서드가 호출된 시점은 정확하지 않습니다.프로그램이 종료될 때 즉시 자원을 해제하거나 

 데이터를 최종 저장해야 한다면 프로그램이 종료될 때 명시적으로 메서드를 호출하는 것이 좋습니다.

반응형