개발하슈
[java] Garbage Collector 본문
- JVM(Java Virtual Machine) : 운영체제의 메모리 영역에 접근하여 메모리를 관리하는 프로그램
- 메모리 관리, Garbage Collector 수행
- Garbage Collector : 동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능
- 동적으로 할당한 메모리 -> Heap
- Stack : 정적으로 할당한 메모리 영역
- 원시 타입의 데이터가 값과 함께 할당, Heap 영역에 생성된 Object 타입의 데이터의 참조 값 할당
- Heap : 동적으로 할당한 메모리 영역
- 모든 Object 타입의 데이터가 할당, Heap영역의 Object를 가리키는 참조 변수가 Stack에 할당
- Garbage Collector 과정
- Garbage collector 가 Stack의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹한다 (Mark)
- Reachable Object가 참조하고 있는 객체도 찾아서 마킹한다 (Mark)
- 마킹되지 않은 객체를 Heap에서 제거한다 (Sweep)
-> 참조되는 객체를 찾아서 마킹하고 그 외에 것을 삭제한다 (Mark and Sweep이라고 한다)
- Garbage Collection은 언제 일어날까?
- Heap에서 새로운 객체는 Eden 영역에 할당된다
- Eden 영역의 메모리가 다 사용되면 이 때 GC 발생한다 (Minor GC 라고 함)
- Eden 영역객체가 다 할당되면 Survival0영역으로 이동한다
- Eden 영역의 Unreachable 객체는 메모리에서 해제된다
- 이 과정이 계속 반복한다
- Survival0영역이 다 차면 여기서 또 GC 발생
- 여기서 살아남은 객체를 Survival1 로 이동한다
- Survival0 영역과 Survival1 영역의 둘중 하나는 비어있어야한다(0->1 ,1->0)
- 이동할 때마다 객체의 age 가 증가한다
- 이 과정을 반복하다가 객체의 age가 age threshold 에 도달하면 살아남아 있는 객체는 Old generation영역으로 이동한다 (Promoted)
- Old generation영역이 가득 차면 GC를 실행한다 (Major GC 라고한다)
- 이 과정이 반복되면서 Gabage Collector가 메모리를 관리한다