일반적으로 프로그램이 실행될 때, 메모리는 동적으로 할당되어 사용이 되는데, 이렇게 사용된 메모리는 필요 없어지만 다시 해제되어야 합니다.
이러한 불필요한 메모리 영역을 자동으로 탐지하고 해제하여 프로그램이 메모리를 효율적으로 사용할 수 있도록 하는 걸 Garbage Collection 이라고 합니다.
어떤 방식의 Garbage Collection을 사용하든 실행 시간에 작업을 하는 이상 성능 하락을 피할 수 없고, 더 이상 젒근이 불가능한 객체만 회수하기 때문에 메모리 누수는 발생할 수 있다는 한계가 있습니다.
Serial GC
Serial GC는 하나의 스레드로 GC를 실행하는 방식인데, 하나의 스레드로 GC를 실행하다 보니 Stop The World 시간이 긴 것을 알 수 있습니다. 싱글 스레드 환경 및 Heap 영역이 매우 작을 때 사용되는 방식입니다.
Parallel GC
Parallel GC의 기본적인 처리 과정은 Serial GC와 동일합니다.
다만, Parallel GC는 여러개의 스레드로 GC를 실행하기 때문에 앞선 Serial GC보다 Stop The World 시간이 짧아집니다. 멀티 코어 환경에서 애플리케이션 처리 속도를 향상시키기 위해 사용되며, Java 8 에서 기본적으로 쓰이는 GC 방식입니다.
CMS GC
CMS GC 에서 CMS는 Concurrent-Mark-Sweep의 줄임말로 Stop The World 시간을 최소화 하기 위해 고안되었습니다. 대부분의 Garbage 수집 작업을 애플리케이션 스레드와 동시에 수행하여 Stop The World 시간을 최소화 하고 있습니다. 하지만 메모리와 CPU를 많이 사용하고, Mark And Sweep 과정 이후 메모리 파편화를 해결하는 Compaction이 기본적으로 제공되지 않는다는 단점이 있습니다.
CMS GC
G1 GC는 전체 힙을 작은 영역으로 나누고, 각 영역에서 Garbage Collection을 수행하는데, 이 과정에서 더 이상 필요하지 않은 객체를 식별하고 메모리에서 제거합니다.
이렇게 작은 영역으로 나눠 병렬로 Garbage Collection을 실행하면 전체 프로그램에 영향을 최소화하면서도 메모리를 효율적으로 관리할 수 있고, G1 GC는 성능을 최적화하기 위해 가장 부담이 큰 영역을 먼저 처리합니다.
또, 프로그램을 중단시키지 않고도 메모리를 효율적으로 관리해서 프로그램의 안정성과 성능을 유지하며 메모리를 관리합니다.