데브허브 | DEVHUB | [10분 테코톡] 가이온의 Garbage Collection[10분 테코톡] 가이온의 Garbage Collection
- GC는 동적으로 할당된 불필요한 메모리를 자동으로 해제하여 메모리 누수 및 오류를 방지합니다. ♻️
- GC는 애플리케이션 실행을 일시 중단(Stop-the-World)시켜 오버헤드를 발생시키고, 발생 시점을 예측하기 어렵다는 단점이 있습니다. ⏸️
- 레퍼런스 카운팅 GC는 각 객체의 참조 횟수를 세어 0이 되면 해제하지만, 순환 참조 문제를 해결하지 못합니다. 🔗
- 마크 앤 스윕 GC는 RootSpace부터 접근 가능한 객체를 표시(Mark)하고, 표시되지 않은 객체를 제거(Sweep)하여 순환 참조 문제를 해결합니다. 🧹
- 카피잉 GC는 RootSpace부터 접근 가능한 객체만을 다른 영역으로 복사하고 기존 영역을 비워 메모리 단편화를 줄이며 순환 참조를 해결합니다. 📄
- JVM은 힙 영역을 Young Generation과 Old Generation으로 나누어 효율적인 GC를 수행하는 세대별 GC를 사용합니다. 🌳
- Young Generation은 Eden, Survivor 0, Survivor 1 영역으로 구성되며, 주로 짧게 살아남는 객체들이 생성되고 Minor GC(카피잉 GC)가 발생합니다. 👶
- Minor GC에서 여러 번 살아남은 객체는 'age'가 증가하며, 특정 나이가 되면 Old Generation으로 승격(Promotion)됩니다. 🚀
- Old Generation에서는 주로 오래 살아남는 객체들이 위치하며, Major GC(마크 앤 스윕)가 발생합니다. 👴
- Old Generation에서 카피잉 GC 대신 마크 앤 스윕을 사용하는 이유는, 대부분의 객체가 오래 살아남아 복사 비용이 비효율적이기 때문입니다. 🤔