본문 바로가기
Java

java Garbage collection / 자바 가비지 컬렉션

by 자유코딩 2017. 9. 23.

이번 글에서는 오브젝트 클래스에 대해서 알아보도록 하겠습니다.

 

Object 클래스에 대해서 알아보기 전에, 가비지 컬렉터와 인스턴스 소멸에 대해서 이야기 해보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class MyName {
    String objName;
    public MyName(String name)
    {
        objName = name;
    }
    protected void finalize() throws Throwable{
        super.finalize();//finalize메소드 오버라이딩
        System.out.println(objName+"이 소멸되었습니다.");
    }
    public static void main(String[] args) {
        MyName obj1 = new MyName("인스턴스1");
        MyName obj2 = new MyName("인스턴스2");
        obj1 = null;//가비지 컬렉션의 대상
        obj2=null;//가비지 컬렉션의 대상
        System.out.println("프로그램을 종료합니다.");
        //finalize 메소드는 호출 되지 않을 수 있다.
        //Garbage Collection이 실행되는 시기와 인스턴스의 완전한 소멸의 시기는 차이가 날 수 있다.
    }
 
}
cs

 

 

소스코드를 보시면 obj1 과 obj2 둘다 값이 null입니다.

객체가 가지고 있는 주소가 없습니다. 그래서 가비지 컬렉션의 대상이 됩니다.

가비지 컬렉션은 프로그램 수행 중 일어날 수도 있고, 프로그램이 종료된 후에 수행 될 수도 있습니다.

 

 

 가비지 컬렉션은 한 번도 발생하지 않을 수 있다.

 가비지 컬렉션이 발생하면, 소멸의 대상이 되는 인스턴스는 결정 되지만 이것이 실제 소멸로 바로 이어지지는 않는다.

 인스턴스의 실제 소멸로 이어지지 않은 상태에서 프로그램이 종료될 수도 있다. 종료가 되면 어차피 인스턴스는 소멸된다.

 따라서 반드시 finalize 메소드가 반드시 호출되기를 원한다면 아래에서 보이는 코드가 추가로 삽입되어야 한다.

 

다음은 가비지 컬렉션에 관한 메소드들 입니다.

 

 System.gc(); 

 가비지 컬렉션을 명령한다.

 System.runFinalization();

 가비지 컬렉터에 의해서 소멸이 결정된 인스턴스를 즉시 소멸하라.

 

댓글