Garbage Collector
수행Heap
에서 사용하지 않는 영역을 탐지하여 해제하는 기능
Stack
- 정적으로 할당한 메모리 영역
- 원시 타입의데이터가 값과 함께 할당
Heap
영역에 생성된Object
타입의 데이터의 참조 값 할당
Heap
- 동적으로 할당한 메모리 영역
- 모든
Object
타입의 데이터가 할당Heap
영역의Object
를 가리키는 참조 변수가Stack
에 할당
public class Main{
public static void main(String[] args) {
int num1 = 10;
int num2 = 5;
String name = "pang";
}
}
num1 = 10
, num2 = 5
, 객체 String
을 참조하는 변수 name
가 Stack
에 저장됨String
은 Object
이기 때문에 Heap
에 저장
메서드가 종료된다면 Stack
영역의 데이터는 소멸되지만, Heap
영역의 객체 타입만 남게 된다.
결국 Heap
에 저장되어 있는 객체 타입으로 데이터만 남게되고, 이러한 데이터를 unreachable object
라고 부르며, garbage collector
의 대상이 된다.
Garbage collector
가 Stack
의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 마킹한다.
Reachable Object
가 참조하고 있는 객체도 찾아서 마킹한다.
마킹되지 않은 객체를 Heap
에서 제거한다.
1, 2
는 확인하는 과정이기에 Mark
3
은 제거하는 과정이라 Sweep
라고 부른다. Heap
영역은 New Generation
, Old Generation
으로 나뉘고 특히 New Generation
은 Eden
, Survival 0
, Survival 1
으로 나뉜다.새로운 객체는 Eden
영역에 할당된다.
Eden
영역의 메모리가 모두 사용되었다면 GC가 발생한다.
Eden
영역에 GC가 발생한 후, Reachable
객체는 Survival 0
으로 옮겨진다.
1~3
의 과정이 반복되면서 Survival 0
이 다찬다면 Survival 0
영역에 대해 Mark & Sweep
가 일어난다.
Survival 0
영역에 Mark & Sweep
가 일어나면 Survival 0
영역의 객체는 Survival 1
영역으로 이동하며, 이동한 객체는 Age
값이 증가.
1~3
의 과정이 반복되며 Eden
영역에서 GC가 발생했다면 Survival 0
, Survival 1
영역 중 이미 객체가 차있는 공간에 쌓이게 된다.
둘중 하나는 항상 비어있는 상태로 유지가 된다.
이러한 과정이 반복되며 Age
값이 특정 값 이상이 된다면 Old Generation
영역으로 옮겨진다. 이러한 과정을 Promotion
이라고 한다.
Old Generation
영역이 가득 차게된다면 GC를 실행하게 되는데 이것을 Major GC
라고 부른다.