코드 저장소.

GC(Garbage Collector) 본문

Java

GC(Garbage Collector)

slown 2025. 9. 6. 11:35

목차

1.GC?

2.GC의 구조 및 작동원리

3.GC의 종류

 

1.GC?

 

GC는 JVM에서 메모리 관리를 위해 사용이 되며 ‘더 이상 참조되지 않는 객체들을 자동으로 탐지하고 해제’하는 역할을 수행합니다. 이를 통해 메모리 관리를 효율적으로 처리하며 프로그램 실행 중에 메모리 누수를 방지하고 메모리 사용을 최적화합니다.

 

개발자들은 가비지 컬렉터를 통해서 메모리 관리에 대한 직접적인 관여 없이도 안정적인 프로그램을 작성을 할 수 있습니다.

가비지 컬렉터는 메모리 영역에서 중에서 힙 영역 내에서 이를 관리를 하고 사용을 합니다.

 

2.GC의 구조 및 작동원리

GC의 구조는 힙영역에서 Young Generation, Old Generation, Meta space로 나뉘어집니다. 

 

Young Generation 

이 부분은 새로 생성된 객체가 있는 곳입니다. 대부분의 객체는 쓸모가 없어지기 때문에 이부분에서 GC가 발생을 하는데 이때 발생하는 GC를 Minor GC라고 합니다. Young Generation은 eden, survivor space1, survivor space2로 나뉘어집니다. 

 

eden: 객체가 처음으로 생성이 되는 공간입니다.

survivor space1: eden에서 살아남은 객체들이 이동하는 공간입니다.

survivor space2: Survivor Space 1에서 살아남은 객체가 이동하는 공간입니다. 두 개의 Survivor Space는 번갈아가며 사용됩니다.

 

Old Generation

young generation에서 여러번의 minor GC를 거치고도 살안남은 객체들이 이동을 하는 공간입니다. 오래 유지되는 객체는
여기에 모이고, Young generation보다 GC빈도가 낮다. 그리고 이공간에서 발생하는 GC는 Major GC, Full GC라고 한다.

 

Meta space

클래스 메타 데이터, 클래스의 구조 정보 등이 저장되는 영역. 이 영역은 네이티브 메모리에 위치한다.

 

다음은 GC가 어떻게 작동을 하는지를 보겠습니다.

 

GC의 작동원리

Minor GC 

-  Eden space에 객체가 가득차면 Minor GC가 작동을 합니다.
-  Eden space와 하나의 Survivor space에 있는 객체 중 참조되지 않는 객체는 삭제를 합니다.
-  참조가 유지되는 객체는 다른 비어있는 Survivor space로 이동을 합니다.
-  이 과정을 여러번 거치면서 객체의 나이가 증가를 한다. 특정 나이에 도달을 하면 객체는 Old Generation으로 승격을 합니다.

Major GC 

-  Old Generation이 가득 차거나, Minor GC 후에도 객체를 저장할 공간이 부족할 때 발생합니다.
-  Old Generation에 있는 모든 객체를 검사하여 참조가 없는 객체를 삭제합니다.
-  Full GC는 Young Generation과 Old Generation 전체를 대상으로 하기 때문에 Minor GC보다 훨씬 오랜 시간이 소요됩니다. 이로 인해 애플리케이션 성능에 큰 영향을 줄 수 있습니다.

 

GC는 STW(Stop the world)가 일시정지 현상을 일으킵니다. 이는 GC가 작동이 되는 동안에 어플리케이션의 모든 스레드가 정지를 하는 것이므로 GC는 STW의 기간을 늦추는것이 목표입니다.

3.GC의 종류

자바는 여러 종류의 GC 알고리즘을 제공하며, 각 알고리즘은 성능 특성이 다릅니다.

Serial GC: 하나의 스레드가 GC 작업을 모두 처리하는 가장 간단한 GC입니다. 소규모 애플리케이션에 적합합니다.

Parallel GC: Young Generation GC를 여러 스레드가 동시에 처리하여 처리량을 높입니다. 서버 애플리케이션의 기본 GC로 많이 사용됩니다.

CMS (Concurrent Mark Sweep) GC: 애플리케이션 스레드와 GC 스레드가 동시에 실행되어 Stop-the-World 시간을 줄이려고 노력합니다.

G1 (Garbage-First) GC: 힙을 여러 개의 Region으로 나누어 관리합니다. GC가 필요한 Region을 빠르게 파악하여 부분적으로 GC를 수행함으로써 Full GC를 최소화하고 Stop-the-World 시간을 줄입니다. 자바 9 이후의 기본 GC입니다.

ZGC / Shenandoah GC: 매우 짧은 Stop-the-World 시간을 목표로 하는 최신 GC입니다. ZGC는 기가바이트 이상의 대용량 힙에서도 10ms 미만의 정지 시간을 보장합니다.

 

'Java' 카테고리의 다른 글

Generic  (0) 2025.09.13
== vs equals(), hashCode()  (0) 2025.09.06
Exception 처리 (Checked vs Unchecked)  (0) 2025.09.06
String vs StringBuilder vs StringBuffer  (0) 2025.09.05
GraalVM?  (0) 2025.08.05