1. 가비지 컬렉션(Garbage Collection)이란?
Java의 가비지 컬렉션은 Heap 영역에서 더 이상 참조되지 않는 객체를 제거하는 메모리 관리 프로세스입니다.
2. Heap 영역 구조
가비지 컬렉션은 Heap 영역에서 수행됩니다. 먼저 Heap 영역의 구조를 살펴보겠습니다.
Heap 영역은 크게 두 가지로 나누어집니다.
[1] Young Generation(젊은 세대): 새로 생성된 객체들이 할당되는 영역입니다. Young Generation은 Eden 영역과 두 개의 Survivor 영역(Survivor0, Survivor1)으로 나누어집니다.
- Eden: 새로 생성된 객체들이 최초에 할당되는 영역입니다.
- Survivor(Survivor0, Survivor1): Eden 영역이 가득 차면, Eden 영역과 Survivor 영역에서 참조가 유지된 객체들이 비어 있는 Survivor 영역 중 하나로 이동합니다. 두 Survivor 영역 중 하나는 항상 비어있어야 합니다. 객체가 Survivor 영역으로 이동하면 객체의 age가 증가합니다.
[2] Old Generation(오래된 세대): 객체가 특정 age에 도달하면 Old Generation으로 이동합니다.
3. 가비지 컬렉션 작동 방식
가비지 컬렉션의 작동 방식은 크게 4가지로 구분됩니다.
- Mark(표시): 루트 객체들로부터 도달 가능한 객체를 표시하여 가비지 컬렉션이 어떤 객체가 여전히 참조되고 있는지를 식별합니다.
- Sweep(제거): 표시되지 않은 객체를 제거하여 메모리를 반환합니다.
- Copy(복사): Eden 영역이 가득 찰 때마다 Eden 영역과 Survivor 영역에서 살아남은 객체를 비어있는 Survivor 영역으로 복사합니다. 또는 메모리 공간을 압축할 때, 비어있는 메모리 공간에 살아남은 객체를 복사합니다.
- Compact(압축): 일부 가비지 컬렉션에서 사용되며, 메모리 공간을 조각화되지 않도록 압축하여 연속된 블록으로 정리합니다. Old Generation에서 사용됩니다.
4. 가비지 컬렉션 실행 과정
[1] 새로 생성된 객체들이 Eden 영역에 할당됩니다.
[2] Eden 영역이 가득차면 Minor Garbage Collection(Minor GC)이(가) 수행됩니다.
Minor GC란? Minor GC는 Young Generation에서 수행되는 가비지 컬렉션의 작업을 의미합니다.
[3] 가비지 컬렉션은 루트 객체들로부터 참조 체인을 따라가며 도달 가능한 객체를 표시합니다.(Mark)
[4] 표시된 객체를 비어있는 Survivor 영역으로 복사시킵니다. 처음은 Survivor0으로 복사시킵니다. 객체가 Survivor 영역으로 복사되면 해당 객체의 age가 증가합니다.(Copy)
[5] 복사가 이루어진 Survivor 영역을 제외한 나머지 Young Generation 영역의 객체들을 제거합니다.(Sweep)
[6] 다시 Eden 영역이 가득 차면 Minor GC가 수행됩니다.
[7] Mark
[8] Copy
[9] Sweep
[10] 위 과정이 반복되면서, 객체가 특정 연령에 도달하면 해당 객체는 Old Generation으로 복사됩니다. 그 후 Survivor 영역의 원본은 삭제됩니다. 이 과정을 승급(Promotion)이라고 합니다.
[11] Old Generation 영역이 가득 차면 Major Garbage Collection(Major GC)이(가) 수행됩니다.
Major GC란? Major GC는 Old Generation에서 수행되는 가비지 컬렉션의 작업을 의미합니다.
[12] Mark
[13] Sweep
[14] Compact(비어있는 공간에 표시된 객체를 복사하고 원본을 삭제. 즉, Copy + Sweep)
가비지 컬렉션의 동작 원리를 이해하면 개발에 있어 효율적인 메모리 사용에 도움이 됩니다.