본문 바로가기

전공 과목 시험정리/JAVA

가비지 콜렉션 (Garbage Collection)

자바에서 new로 할당받은 후 사용하지 않게 된 객체 메모리는 어떻게 될까?

이들은 가비지(Garbage) 가 되어 자바 가상 기계의 가비지 컬렉터에 의해 적절한 시점에 

자동으로 수집되어 가용 메모리에 리턴된다.


1. 다음 소스에서 잘못된 부분을 모두 수정하라.

1
2
3
4
5
6
7
8
9
10
11
class Samp {
    int id;
    public void Samp(int x) {
        this.id = x;
    }
    
    public void Samp() {
        System.out.println("생성자호출");
        this(0);
    }
}
cs



2. 다음 소스는 오류를 포함하고 있다. 이유를 설명하고 올바르게 수정하라

1
2
3
4
5
6
7
8
9
10
11
12
13
class ConstructorExample {
    int x;
    public void setX(int x) { this.x = x; }
    public int getX() { return x; }
    public ConstructorExample (int x) {
        this.x = x;
    }
    public static void main(String[] args) {
        ConstructorExample a = new ConstructorExample();
        int n = a.getX();
    }
}
 
cs



3. this 와 this() 의 차이를 설명하라.


1,2,3 답은 카톡으로 물어보면 보내드림.



가비지와 가비지 콜렉션


가비지 (Garbage)

가비지란 간단히 응용 프로그램에서 더 이상 사용되지 않는 메모리 이다.

new 를 통해 메모리를 할당하고, 더 이상 사용하지 않을 때 해당 객체나 배열 메모리는 가비지가 된다. (더 이상 사용하지 않을 때는 해당 객체나 배열을 가리키는 레퍼런스가 하나도 없을 때)


아래의 소스를 보자

1
2
3
4
= new Person("왕승현");
= new Person("정상민");
 
b=a;

cs

레퍼런스 b는 처음 가리키던 객체 대신 객체 a를 가리키게 되고, 레퍼런스 b가 가리키던 처음 Person 객체는 어떤 레퍼런스 변수도 참조하지 않게 되어 더 이상 접근할 수 없게 되었다.  이것이 가비지 이다.


1. 다음 소스에서 가비지가 언제 발생하는 지 설명하라.


1
2
3
4
5
6
7
8
9
10
11
12
public class GarbageEx {
    public static void main(String[] args){
        String a = new String("Good");
        String b = new String("Bad");
        String c = new String("Normal");
        String d,e;
        a = null;
        d = c;
        c = null;
    }
}
 

cs

위 코드를 실행하면 아래 표와 같은 결과가 나온다.



a

"Good"

 7,8,9 라인 실행 후

---------------->

a

NULL

b

"Bad"

b

"Bad"

c

"Normal"

c

NULL

d


 d 

"Normal"

e


e

NULL



가비지 컬렉션 (Garbage Collection)

가비지는 더 이상 참조되지 않기 때문에, 가비지가 차지하고 있는 메모리 곡ㅇ간은 다시 회수해야 한다.


가비지가 많아지면 응용 프로그램에게 할당 해줄 메모리가 부족해진다. 

즉, 가용 메모리의 양이 줄어들게 된다.


이런 경우를 대비해 JVM (자바 가상 기계) 는 가용 공간이 일정 크기 이하로 줄게 되면 자동으로 가비지를 회수하여 가용 메모리 공간을 늘린다. 이것을 가비지 콜렉션이라고 부른다.

가비지 콜렉션을 수행하는 주체를 가비지 콜렉터 라고 하고, 

JVM은 가비지 컬렉터 역할을 수행하는 쓰레드를 두고 있다.


가비지 콜렉션은 JVM의 내부 알고리즘에 의해 일어나기 때문에, 언제 가비지 콜렉션이 일어나는지 예측할 수 없다.


--> 이러한 이유로, 자바는 실시간 처리 응용에는 부적합한 것으로 알려져 있다.


가비지 콜렉션 강제 수행

응용 프로그램에서 System 또는 Runtime 객체의 gc() 메소드를 호출하면 강제적으로 가비지 콜렉션을 수행할 수 있다.

1
System.gc(); // Request Garbage Collection

cs

그러나 이 문장을 호출한 즉시 가비지 콜렉터가 작동하는 것은 아니고, 그냥 JVM에 가비지 콜렉션이 필요하다는 것만 제안을 하는 것에 불과하다.


가비지 콜렉션은 JVM 가 전적으로 판단하여 작동된다.






'전공 과목 시험정리 > JAVA' 카테고리의 다른 글

시험정리 + 풀이  (0) 2015.04.30
자바 언어의 이해  (0) 2015.04.30
자바 다중 상속 지원.  (0) 2015.04.30
시험정리  (0) 2015.04.27
자바 OT  (0) 2015.03.03