Java 9 이전의 GC
이전 글에서 GC가 어떻게 일어나는지를 살펴보았다. 이전 글에서 살펴본 GC는 모든 메모리를 랜덤으로 찾아보면서 Memory 상의 객체들 중 Reference(Mark)되지 않은 객체를 GC하며 GC를 할 때마다 살아남은 객체들은 eden -> survivor0 -> survivor1 -> old 영역으로 순서대로 시킨다.
G1 GC의 효율성
Region 으로 나누어 제거
Java9+ 부터 기본 GC로 자리잡은 G1 GC에서는 이전의 GC들처럼 일일히 메모리를 탐색해 객체들을 제거하지 않는다. 대신 메모리가 많이 차있는 영역(region)을 인식하는 기능을 통해 메모리가 많이 차있는 영역을 우선적으로 GC 한다. 즉, G1 GC는 Heap Memory 전체를 탐색하는 것이 아닌 영역(region)을 나눠 탐색하고 영역(region)별로 GC가 일어난다.
예를 들어 [그림1]의 eden이 4개 모여있는 영역을 확인하면 이 영역을 우선적으로 GC한다. 이러한 Garbage가 많은 영역을 우선적으로 GC하는 특성 때문에 Garbage First(1) Collection이라 명명되었으며 약자로 G1 GC라 부른다.
Young Generation의 Reallocation(재할당)
또한 이전의 GC 들은 Young Generation에 있는 객체들이 GC가 돌때마다 살아남으면 Eden->Survivor0->Survivor1으로 순차적으로 이동했지만, G1 GC에서는 순차적으로 이동하지는 않는다. 대신 G1 GC는 더욱 효율적이라고 생각하는 위치로 객체를 Reallocate(재할당) 시킨다. 예를 들어 Survivor1 영역에 있는 객체가 Eden 영역으로 가는 것이 더 효율적이라고 판단될 경우 Eden 영역으로 이동시킨다. 즉, G1 GC부터는 더이상 Young Generation에서 영역의 순서가 보장되지 않는다.