소멸자(finalize)를 학습하던 중, 소멸자가 System.gc();를 설명하는 예제에 많이 쓰이는 것을 보고, 가비지 컬렉션(Garbage Collection)에 대해 알아보게 되었습니다.
Garbage Collection(가비지 컬렉션)이란?
자바의 메모리 관리방법 중 하나로, 참조가 더 이상 일어나지 않는 메모리를 해제시켜 공간을 확보하는 방법입니다.
가비지 컬렉션을 수행하는 가비지 컬렉터는 코드를 작성하는 개발자가 메모리 할당과 해제에 일일히 관여하지 않아도 관리가 되게끔 도와줍니다. (C, C++ 에서는 메모리 할당/해제를 직접 관리해줘야 한다고 합니다...)
메모리 공간을 자동으로 확보하면서 메모리 누수를 방지하는 장점이 있지만,
메모리가 해제되는 시점을 알 수 없다는 단점도 존재합니다.
System.gc();
명시적으로 가비지 컬렉션을 발생시키는 메소드입니다.
⛔ 이 메소드는 왠만해서는 사용하지 않는 것을 권장합니다. 해당 메소드 자체가 무거운 작업을 요구하고, 모든 스레드를 중단시켜버리기 때문입니다
가비지(쓰레기) 수거 순서
아래 예제에서는 가비지 수거가 일어나는 순서를 알아보았습니다.
- 생성과 소멸 시 name을 출력하는 Test 클래스를 선언했습니다.
- Test 클래스의 인스턴스 a,b,c,d를 각각 생성해주었습니다.
- a,b,c,d에 null을 할당해주면서, 필요없는 가비지(쓰레기)로 만들어주었습니다.
- System.gc(); 메소드로 가비지 컬렉션을 일으켰습니다.
public class GC_test {
static class Test {
String name;
Test(String name) {
this.name = name;
System.out.println(name + "생성");
}
@Override
protected void finalize() {
System.out.println(this.name + "제거");
}
}
public static void main(String[] args) {
Test a = new Test("a");
Test b = new Test("b");
Test c = new Test("c");
Test d = new Test("d");
a = null;
b = null;
c = null;
d = null;
System.gc();
// 프로세스 강제종료를 방지
try{
Thread.sleep(1000);
} catch(InterruptedException e){
e.printStackTrace();
}
}
}
- 첫 번째 실행 결과 (제거 순서 : a-d-b-c)
- 두 번째 실행 결과 (제거 순서 : a-b-d-c)
- 세 번째 실행 결과 (제거 순서 : d-a-b-c)
결론적으로, 가비지(쓰레기) 컬렉션은 메모리 할당 순서와 상관없이 랜덤한 순서로 일어나는 것을 확인할 수 있었습니다.
'Java' 카테고리의 다른 글
[Java] String.format();으로 출력 서식 지정하기 (0) | 2023.01.18 |
---|---|
[Java] 문자열 클래스 - String과 StringBuilder (0) | 2023.01.11 |
[Java] print 메소드와 BufferedWriter로 콘솔에 출력하기 (0) | 2023.01.09 |
[Java] Scanner와 BufferedReader로 콘솔에서 입력 받기 (0) | 2023.01.07 |