동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능
객체들은 Heap 영역에 생성되는데 객체들이 각각 Reference Count라는 별도의 숫자를 가지고 있다. Reference count가 0이 될 경우 제거하는 방식
Root Space에서 접근할 수 없으나 내부 순환참조(서로가 서로를 참조)가 있어 reference count가 0이 되지 않을때 → 사용하지 않는 메모리 영역이 해제되지 못하고 메모리 누수가 발생함
Garbage Collector가 Stack의 모든 변수를 스캔(DFS)하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹한다. (Mark) 그 후 마킹되지 않은 객체를 Heap에서 제거한다. (Sweap)
메모리 파편화를 방지하기 위해 Compaction을 실시할 수 있는데 Mark & Sweep에서는 필수가 아니다.
새롭게 생성된 객체들이 할당되는 영역. Eden의 영역이 다 차게되면 Minor GC가 발생하고 Survival 영역에 번갈아가면서 살아남은(Reachable) 객체를 이동시킨다.
Survival 0 혹은 1 둘 중 하나는 무조건 비어있어야 한다.
Eden에서 Survival로, Survival에서 Survival로 영역이 다 차서 Minor GC가 발생하여 살아남은 객체가 이동할 떄는 age bit값이 1씩 증가하게 된다.
JVM GC에서는 일정 수준의 age-bit를 넘어가면 해당 객체를 Old Generation으로 이동시킨다.(Promotion)
Java 8에서는 Parallel GC 방식 기준 age-bit가 15가 되면 promotion 발생
Old Generation 영역이 다 차는 순간 Major GC 발생, Mark & Sweap이 진행되고 필요 없는 메모리를 비운다.
Stop The World : GC를 실행하기 위해 JVM이 어플리케이션 실행을 멈추는 것
GC를 처리하는 스레드가 1개이다.
CPU 코어가 1개만 있을 때, Heap이 매우 작을 때 사용하는 방식
Mark-Compact collection 알고리즘 사용
GC를 처리하는 스레드가 여러개이다.
Parallel GC는 메모리가 충분하고 코어의 개수가 많을 때 사용하면 좋다.
GC작업을 어플리케이션 스레드와 동시에 실행 - stop the world시간을 최소화
메모리를 많이 사용하고 Mark & Sweap 작업 이후 Compaction이 기본적으로 제공되지 않는다.
Heap을 일정 영역의 Region으로 나누어 일부는 Young Generation으로 나머지는 Old Generation으로 사용
Runtime에 G1 GC개 영역별 Region 개수 튜닝