20.03 ~ 20.08 국비교육/JAVA

Garbage collection

찹키리 2020. 3. 26. 11:30

<Garbage collection>


1)참조되지 않는 힙 영역의 메모리(멤버 변수)를 가상머신(JVM)이 자동으로 수거하는 기능
-> 멤버 변수가 사용되지 않을 때(참조되지 않을 때) 자동으로 수거된다. 

 

ex.

Hi hi = new Hi();
hi.a = 100;
hi = null; ---> gc대상으로 등록됨(null값으로 초기화되면 hashcode 끊기고 참조가 안 되니까)

 

*Heap 메모리 안 영역

eden - survivor - tenure(가비지 컬렉션 일어나는 영역) - permanent generation

 

 

2)gc는 우선순위가 낮으며, 주로 모든 스레드(thread) 실행이 끝나고 여유가 생기면 실행된다(수거한다).
System.gc(); ---> 강제수거명령. 직접 수거명령을 내리기 전까지는 jvm이 알아서 처리한다.

3)강제 수거는 별로 권장하지 않으며, 자동으로 수거하는 것이 바람직하다.

 

 

<예제>

 

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
31
 
class Garbage {
    int objNo;
    public Garbage(int n) {
        objNo = n;
        System.out.println("Garbage class " + objNo + "이 만들어졌습니다.");
    }
    protected void finalize() throws Throwable {
                    //finalize: gc가 실행되면 자동 호출되는 메소드
        System.out.println("Garbage class " + objNo + "에서 쓰이던 메모리가 수집되었습니다.");
        //뭐가 제거되는 알기 위한 출력
        super.finalize(); //상위 메소드 한번 더 호출
    }
}
 
public class GarbageTest {
    public static void main(String args[]) {
        Garbage[] ga = new Garbage[10]; //객체 배열변수
 
        for(int i = 0; i < ga.length; i++) {
            ga[i] = new Garbage(i)
            //객체의 생성 -> 10번의 new를 만나 영역을 생성
        }
 
        for(int i = 0; i < ga.length; i++) {
            ga[i] = null//메모리 참조 삭제
        }
 
        System.gc() //강제수거명령!
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

*Object = 모든 클래스의 가장 최상위 클래스. 자바 컴파일러는 일반 클래스를 object 하위 클래스로 자동 상속시킨다. 

*finalize: gc가 수거될 때 콘솔 창에 뜨도록 설정된 메소드

'20.03 ~ 20.08 국비교육 > JAVA' 카테고리의 다른 글

클래스 상속관계에서의 생성자  (0) 2020.03.27
상속, 오버라이딩(Overriding)  (0) 2020.03.26
접근제한자  (0) 2020.03.26
생성자의 생략, 코드 중복  (0) 2020.03.25
변수 유효범위  (0) 2020.03.24