
가비지 컬렉션은 자바의 핵심 특징 중 하나이다. 하지만, GC를 본격적으로 파헤쳐 보기 전에 GC의 단점도 있다는 것을 명심해야한다.
GC의 단점
- 개발자가 메모리가 언제 해제되는지 정확하게 알 수 없다.
- 가비지 컬렉션(GC)이 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생한다.
가비지 컬렉션에는 장점만 있는 것이 아니라 단점도 존재한다. 대표적으로는 위의 2가지 단점이 존재한다. 이 중에서 경우에 따라서 문제가 발생할 수 있는 부분은 GC가 동작하는 동안에는 JVM의 다른 동작들은 잠깐 멈추기 때문에 오버헤드가 발생한다는 것이다. 이로 인해 GC가 너무 자주 실행되면 소프트웨어 성능 하락의 문제가 된다. 이러한 특성으로 인해 실시간으로 계속 동작해주어야 하는 시스템들 예를 들자면 열추적 미사일의 경우에는 잠깐의 소프트웨어 일시정지로도 목표한 결과가 달라질 수 있기 때문에 GC의 사용이 적합하지 않을 수 있다.
** 오버헤드란?
오버헤드(overhead)는 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 및 메모리등을 말한다.
예시) A라는 처리를 실행한다면 3초 걸리는데, 안전성을 고려하여 B라는 처리를 추가한 결과 처리시간이 10초 걸렸다면, 오버헤드는 7초가 된다. 추가로 B를 개선해 B라는 처리를 한 결과, 처리시간이 5초가 되었다면, 이 경우 오버헤드가 5초 단축되었다고 말할 수 있다.
GC의 종류
1. Serial GC:
목표
메모리 사용량이 작고 예측 가능한 애플리케이션의 경우, 간단하고 경량의 GC 알고리즘을 제공하여 효율적인 메모리 관리를 수행한다.
특징
- 단일 스레드로 동작하며, STW(Stop-The-World) 방식을 사용한다. 즉, GC 실행 중에 애플리케이션 스레드들이 모두 일시 중지된다.
- 적은 메모리 사용량과 단순한 애플리케이션에 적합하다.
- Minor GC와 Major GC로 구성되며, Minor GC는 Young 영역만 수행하고 Major GC는 전체 힙 영역을 수행한다.
장점
- 단일 스레드로 동작하여 구현이 간단하고 예측 가능하다.
- 적은 메모리 사용량과 단순한 애플리케이션에서 효과적이다.
단점
- STW(Stop-The-World) 시간이 길어 애플리케이션 응답성이 떨어질 수 있다.
- 다른 GC 알고리즘에 비해 처리량이 낮다.
2. Parallel GC:
목표
대용량 데이터 및 처리량이 많은 애플리케이션에 대해 높은 성능과 처리량을 제공한다.
특징
- 다중 스레드로 동작하며, STW( Stop the world) 방식을 사용한다. 여러 개의 스레드를 사용하여 가비지 컬렉션을 병렬로 처리한다.
- 큰 힙 영역에서 좋은 성능을 보이며, 서버 애플리케이션에 적합하다.
- Serial GC와 유사한 방식으로 Minor GC와 Major GC를 수행한다.
장점
- 다중 스레드로 동작하여 병렬 처리를 통해 높은 처리량을 제공한다.
- 서버 애플리케이션 및 대규모 메모리를 요구하는 애플리케이션에 적합하다.
단점
- STW 시간이 길어질 수 있으며, 응답성이 떨어질 수 있다.
- CMS나 G1과 비교하여 애플리케이션 응답성이 낮을 수 있다.
3. CMS (Concurrent Mark Sweep) GC:
목표
STW 시간을 최소화하고 애플리케이션의 응답성을 유지하며, 메모리 사용량이 큰 애플리케이션에서 성능을 향상시킨다.
특징
- 다중 스레드로 동작하며, STW 시간을 최소화하기 위해 일부 작업을 병렬 및 동시에 처리한다.
- 메모리 사용량이 큰 애플리케이션에서 효과적이다.
- 초기 마크 단계, 병렬 마크 단계, 동시 스위핑 단계로 나누어져 수행된다.
- STW 시간을 줄이기 위해 일부 애플리케이션 스레드와 병행하여 실행된다.
장점
- STW 시간을 최소화하여 애플리케이션의 응답성을 향상시킨다.
- 메모리 사용량이 큰 애플리케이션에서 효과적이다.
단점
- 초기 마크 및 마크 단계에서 애플리케이션 스레드와 함께 실행되기 때문에 성능 손실이 있을 수 있다.
- 동시 스위핑 단계에서 애플리케이션 스레드와 동시에 실행되기 때문에 CPU 자원을 일시적으로 많이 사용할 수 있다.
4. G1 (Garbage-First) GC:
목표
대용량 힙 및 대규모 애플리케이션에서 빠른 가비지 컬렉션을 수행하고, 힙 사용량을 효율적으로 관리하여 애플리케이션 응답성을 유지한다.
특징
- 멀티 스레드로 동작하며, 힙을 리전(Region)이라는 작은 영역으로 분할한다.
- 전체 힙을 스캔하면서 가장 많은 가비지를 포함한 리전을 우선적으로 수집하는 방식이다.
- 대규모 메모리와 높은 처리량을 요구하는 애플리케이션에 적합하다.
- STW 시간을 최소화하기 위해 일부 작업을 병렬 및 동시에 처리한다.
장점
- 대규모 메모리와 높은 처리량을 요구하는 애플리케이션에 적합하다.
- STW 시간을 최소화하기 위해 일부 작업을 병렬 및 동시에 처리한다.
- 힙을 리전(Region) 단위로 분할하여 가비지 컬렉션을 수행하기 때문에 세밀한 제어가 가능하다.
단점
- 복잡한 알고리즘으로 인해 구현이 복잡하고 예측하기 어렵다.
- 일부 구현에서는 메모리 오버헤드가 발생할 수 있다.