Garbage는 컴퓨터 메모리에 있지만, 앞으로 사용되지 않을 데이터나 객체 또는 메모리 영역을 가리킵니다.
모든 컴퓨터 시스템은 제한적인 메모리를 가지고 있고, 대부분의 소프트웨어는 Garbage를 만들어내기 때문에, 이를 메모리에서 해제하여 다시 사용할 수 있게 해야 합니다.
먼저 GC는 2가지 전제(weak generational hypothesis)로 만들어졌습니다.
이러한 가정으로 인해서 물리적인 공간을 2개로 나누었습니다.
👶 Young Generation : 새로운 객체들이 할당되는 영역
Age 값이 특정 값 이상이 되면 Old Generation 영역으로 옮겨집니다.
이 과정을 Promotion 이라고 합니다.
🧔♂️ Old Generation : Young Generation에서 오랫동안 살아남은 객체들이 존재하는 영역
Old Generation 영역이 가득차면 GC를 실행하는데, 이를 Major GC라고 합니다.
📦 meta space
가비지 컬렉션 시에 필요한 클래스와 메소드의 요약 정보가 존재하는 영역
📌 주의사항
GC를 처리하는 스레드가 1개이다.
CPU 코어가 1개만 있을 때 사용하는 방식
Mark-Compact Collection 알고리즘 사용
GC를 처리하는 스레드가 여러 개 있다.
Serial GC보다 빠르게 객체를 처리할 수 있다.
Parallel GC는 메모리가 충분하고 코어의 개수가 많을 때 사용하면 좋다.
📌 Stop-The-World
GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다.
stop-the-world가 발생하면 GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업을 멈춥니다.
GC 작업을 완료한 이후에 중단한 작업을 다시 시작한다.
stop-the-world 시간이 짧다.
애플리케이션 응답 시간이 빨라야 할 때 CMS GC를 사용한다.
다른 GC 방식보다 메모리와 CPU를 더 많이 사용한다.
Compaction 단계가 제공되지 않는다.
📌 하지만 현재는...?
Java 9 부터 CMS 가비지 수집기는 더 이상 사용되지 않습니다.
또한 Java 14 는 CMS 지원을 완전히 중단했습니다.
Java9 부터는 G1 GC를 사용한다고 합니다.
CMS GC를 개선
각 영역을 Region 영역으로 나눈다.
GC가 일어날 때,
전체 영역(Eden, Survival, Old generation)을 탐색하지 않는다.
(할당된 리전에 대해서만 탐색)
G1 GC는 바둑판의 각 영역에 객체를 할당하고 GC를 실행한다.
그러다가, 해당 영역이 꽉 차면 다른 빈 영역에, 객체를 할당하고 GC를 실행한다.
G1 GC는 STW 시간이 짧다.
Compaction을 사용한다.