from Dictionary - GC
GC
자바의 메모리 관리 방법 중 하나로 JVM의 HEAP 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체(garbage)를 모아 주기적으로 제거하는 프로세스 (C/C++ 은 수동으로 메모리 할당, 해제를 해야했다.)
1. 대상
판단 근거로 도달성, 도달능력(Reachability)라는 개념을 적용한다. 객체에 레퍼런스가 있다면 Reachable[1], 객체에 유효한 레퍼런스가 없으면 UnReachable[2]로 구분한다. 주로 Heap Area에서 참조하고 있지 않은 객체가 GC 대상이 된다.
청소 방식
Mark And Sweep
GC가 동작하는 가장 기초적인 청소 과정.
GC 대상이 될 객체를 식별(Mark), 제거(Sweep)하며 객체가 제거되며 파편화된 메모리를 영역 앞에서부터 채워나가는 작업을 수행한다.
- Mark : Root Space부터 그래프 순회를 통해서 연결되나 객체를 찾아서 각각 어떤 객체를 참조하고 있는지 마킹
- Sweep : Unreachable를 Heap에서 제거한다.
- Compact : Heap의 시작 주소를 모아 메모리가 할당된 부분과 아닌 부분으로 압축한다. (GC 종류에 따라 하지 않는 경우도 있음 )

GC 동작 과정

Heap은 동적으로 레퍼런스 데이터가 저장되는 공간으로 GC 대상이 되는 공간이다. Heap은 아래 2가지를 전제(Weak Generational Hypothesis)로 설계됐다.
- 대부분 객체는 금방 접근 불가능한 상태(Unreachable)가 된다.
- 오래된 객체에서 새로운 객체로의 참조는 아주 적게 존재한다.
즉, 객체는 대부분 일회성, 메모리에 오랫동안 남을 경우는 드물다는 것이다.

- Young
- 새롭게 객체가 할당되는 영역
- 대부분 객체가 금방 Unreachalbe이 되므로 Young에 생성됐다 사라짐
- Young에 대한 GC를 Minor GC라고 부름
- Old
- Young에서 Reachable을 유지하면 복사되는 영역
- Young보다 크게 할당됨. 크기가 큰 만큼 가비지는 적게 발생
- Old에 대한 GC를 Full GC라고 부름

- Eden
- new를 통해 생성된 위치
- 정기적 쓰레기 수집 후 살아남으면 Survivor로 보냄
- Survivor 0/ 1
- 최소 1 번 이상의 GC에서 살아남은 객체가 존재하는 영역
- Survivor 0, 1 중 하나는 꼭 비어 있다.

MinorGC
Young은 Old에 비해서 상대적으로 작기 때문에 메모리 상의 객체를 찾아 제거하는데 적은 시간이 걸린다.
- 처음 생성된 객체는 Young 영역의 Eden에 위치
- Eden이 꽉차면 MinorGC 발생
- Obj MarK로 Reachable 탐색
- 살아 남은 Obj Survivor로 이동
- Eden의 unreachable gowp
- 살아남은 모든 객체
age[3] += 1 - Eden이 가득 차면 비어있는 Survivor로 Eden, 기존 Survivor 내용들 이동
- 옮긴 Survivor 내역들
age+= 1
MajorGC
Old는 길게 살아남은 메모리들이 존재하는 공간. age 임계 값을 초과해서 이동되는 녀석 가끔 Young에 담을 수 없을 정도로 크면 Old로 보내기도 함 그리고 MajorGC는 객체들이 계속 Promotion되어 Old가 부족해지면 발생
MinorGC vs. MajorGC
| GC Type | MinorGC | MajorGC |
|---|---|---|
| 대상 | Young | Old |
| 실행 시점 | Eden이 꽉 차면 | Old가 꽉차면 |
| 실행 속도 | 빠르다 | 느리다 |
MajorGC는 old가 꽉 차면 Unreachable을 한꺼번에 삭제하는 MajorGC가 실행된다. Young은 크기가 작기에 빠르지만 Old는 크기에 보통 10배 이상의 시간을 사용한다. 또한 STOP-THE-WORLD 가 발생한다. 이 때 Thread가 멈추고 Mark and Sweep을 하므로 일시적으로 멈추기 때문
[1] : 객체가 참조되고 있는 상태
[2] : 객체가 참조되고 있지 않은 상태 (GC 대상)
[3] : Survivor 영역에서 객체가 살아남은 횟수. Object Header에 기록 age가 임계 값에 다다르면 Promotion( Old로 이동 여부를 결정. 기본 임계값은 31)