가비지 컬렉션은 자바의 메모리 관리 방법 중의 하나로 JVM의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체를 모아 주기적으로 제거하는 프로세스를 말함
과거 C / C++ 언어에서는 가비지 컬렉션이 없어 프로그래머가 수동으로 메모리 할당과 해제를 일일이 해줘야 했었음
반면 Java, 파이썬, 자바스크립트, Go 언어 등 많은 언어에서는 가비지 컬렉터가 메모리 관리를 대행해 주기 때문에 한정된 메모리를 효율적으로 사용할 수 있게 하고, 개발자 입장에서 메모리 관리, 메모리 누수 문제에 대해 관리하지 않아도 되어 오롯이 개발에만 집중할 수 있다는 장점이 있음
그러나 자동으로 처리해준다 해도 메모리가 언제 해제되는지 정확하게 알 수 없어 제어하기 힘들며, 가비지 컬렉션이 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생되는 문제점이 있음
GC는 특정 개체에 유효한 레퍼런스가 있는지 유무에 따라 Reachable 과 Unreachable로 구분한다.
어디서든 참조하고 있지 않은 객체(Unreachable)들을 주기적으로 GC가 제거해 준다.
GC는 3가지 단계로 객체를 솎아낸다. (Mark, Sweep, Compaction)
JVM의 힙(heap) 영역은 동적으로 레퍼런스 데이터가 저장되는 공간으로서, 가비지 컬렉션의 대상이 되는 공간이다.
Heap 영역은 처음 설계될 때 다음의 2가지를 전제로 설계되었다.
즉, 객체는 대부분 일회성이며 메모리에 오래 남아있는 경우는 드물다는 것이다.
그렇기에 Heap을 새로운 객체들이 할당되는 영역과 오랫동안 살아남은 객체들이 존재하는 영역으로 나누어 관리한다.
Young 영역(Young Generation)
Old 영역(Old Generation)
Young 영역은 Eden, survivor 0, survivor 1 으로 나뉨
Survivor 영역
Young Generation 공간은 Old Generation 공간에 비해 상대적으로 작기 때문에 메모리 상의 객체를 찾아 제거하는 데 적은 시간이 걸림
=> Young Generation 영역에서 발생되는 GC를 Minor GC라 부름