가비지 컬렉션은 불필요한 메모리를 정리를 해주는 프로세스로 알고 있다. 이번에는 가비지 컬렉션에 대해 더 자세히 알아보고 정리를 해보았다.
객체들은 실질적으로 Heap영역에서 생성되고 Method Area이나 Stack Area 에서는 Heap Area에 생성된 객체의 주소만 참조하는 형식으로 구성된다. Heap에 있는 객체에 참조가 있으면 Reachable 참조가 없으면 Unreachable로 구분을 하고 가비지 컬렉션은 Unreachable된 객체를 정리한다.
가비지 컬렉션에는 GC Root가 존재한다. 루트로 부터 그래프를 순회하여 연결된 객체들을 찾아내어 각각 어떤 객체를 잠조하고 있는지 찾아서 마킹한다.
GC Root는 Heap 메모리 영역을 참조하는 method area, static 변수, stack, native method stack이 되게 된다.
Unreachable 객체들을 모두 제거한다.
Sweep 후에 흩어져있는 객체들을 Heap의 시작 주소로 모아 정렬한다.(가비지 컬렉터 종류에 따라 하지 않는 경우도 있음)
heap영역은 크게 Young Generation와 Old Generation으로 이루어져 있다. 이는 메모리를 효율적으로 관리하기 위해서이다.
Young Generation은 새롭게 생성된 객체가 할당되는 영역으로 이 영역에 대한 가비지 컬렉션을 Minor GC라고 부른다
Old Generation은 Young Generatio에서 살아남은 객체가 복사되는 영역으로 Young Generatio영역 보다 크게 할당이 되어지며 이 영역에 대한 가비지 컬렉션을 Major GC 또는 Full GC라고 부른다.
Young Generation 영역은 Eden, survivor 0, survivor 1 로 나누어진다.
Young Generation의 공간은 Old Generation에 비해 상대적으로 작기 때문에 메모리 상의 객체를 찾아 제거하는데 적은 시간이 걸린다.
살아남은 객체에 age를 계속 증가시키고 있는데 age 값을 기준으로 Young Generation 영역에서 Old Generation 영역으로 이동을 시킨다. VM 중 가장 일반적인 HotSpot JVM의 경우 이 age의 기본 임계값은 31이다.
Major GC는 Old Generation에 데이터가 가득 차면 GC를 실행하는 단순한 방식이다.
Major GC가 실행되면 Old Generation 영역에 있는 Mark and Sweep 과정을 거치게 된다.
Old Generation은 Young Generation에 비해 상대적으로 큰 공간을 가지고 있어, 이 공간에서 메모리 상의 객체 제거에 많은 시간이 걸리게 된다.
여기서 Stop-The-World 문제가 발생되는 이러한 문제를 해결하기 위해 가비지 컬렉션 알고리즘을 발전 시켜왔다. 다음에는 가비지 컬렉션 알고리즘에 대해서 정리를 해보겠다.
참고 문서 및 링크