<aside>
Garbage Collection은 자바에서 메모리를 자동으로 관리해주는 중요한 기능이다. 자바는 개발자가 명시적으로 메모리를 해제하지 않아도 되도록 설계되었고, 그 중심에 바로 GC가 있다. GC는 프로그램 실행 중 더 이상 사용되지 않는 객체(=쓸모없는 객체)를 찾아내고, 이를 자동으로 메모리에서 제거하여 새로운 객체를 위한 공간을 확보한다.
GC의 가장 큰 존재 이유는 자동 메모리 관리이다. 개발자가 일일이 free()
같은 메서드를 호출하여 메모리를 해제해야 하는 언어(C, C++ 등)와 달리, 자바는 객체를 생성한 뒤에는 언제 메모리에서 제거할지 고민할 필요가 없다. GC가 이 모든 과정을 백그라운드에서 처리해주기 때문이다.
이러한 자동화는 개발 생산성을 높이는 동시에, 메모리 누수(memory leak)와 같은 치명적인 오류를 방지하는 데 큰 역할을 한다. 만약 GC가 없다면, 개발자는 모든 객체의 생명주기를 추적하며 언제 해제할지 끊임없이 신경 써야 하고, 이 과정에서 해제하지 않은 객체가 계속 메모리에 남는 문제가 발생할 수 있다. 이는 곧 애플리케이션의 성능 저하 또는 OutOfMemoryError
로 이어진다.
기본적으로 GC는 "더 이상 참조되지 않는 객체는 쓸모없다"고 판단한다. 즉, 어떤 객체가 프로그램의 어떤 변수나 다른 객체에서도 참조되지 않는다면, GC는 이를 회수 대상으로 간주하고 메모리에서 제거한다. 이러한 판단 기준 덕분에, GC는 안전하게 객체를 정리하면서도 애플리케이션의 안정성을 유지할 수 있다.
결론적으로 GC는 단순히 편리한 기능을 넘어, 자바 언어의 핵심 요소 중 하나이며, 안정적이고 효율적인 애플리케이션을 개발하기 위해 반드시 이해하고 활용해야 하는 중요한 기술이다.
GC(Garbage Collector)는 자바 애플리케이션의 메모리를 관리하는 핵심 도구이며, 그 동작 대상은 JVM 내의 특정 메모리 영역에 집중되어 있다. 따라서 GC의 역할과 원리를 깊이 있게 이해하기 위해서는 먼저 JVM의 메모리 구조를 파악하는 것이 중요하다.
JVM에서 메모리는 크게 Heap 영역, Stack 영역, Method Area(Metaspace) 등으로 나뉘며, 이 중 GC가 직접적으로 관여하는 영역은 주로 Heap 영역이다. Heap은 자바 애플리케이션이 실행되는 동안 동적으로 생성되는 객체들이 저장되는 공간이며, 객체가 생성될 때마다 이 영역을 차지하게 된다. GC는 이 Heap 영역을 지속적으로 모니터링하며, 더 이상 사용되지 않는 객체를 탐지하고 이를 회수함으로써 메모리의 효율적인 사용을 돕는다.
Heap 영역은 내부적으로 Young Generation과 Old Generation으로 나뉜다.
또한, 클래스의 메타데이터가 저장되는 Metaspace도 존재하며, 이는 예전의 Method Area를 대체한 구조이다. 이 영역은 JDK 8부터 Heap 외부의 네이티브 메모리(native memory)를 사용하므로 GC가 직접적으로 관리하지는 않지만, 클래스 언로드(unloading) 시 GC가 일부 관여하기도 한다.
결론적으로, GC는 Heap 영역, 특히 Young과 Old Generation을 중심으로 객체의 생존 여부를 판단하고 메모리를 회수하는 작업을 수행한다. 이 구조는 자바의 메모리 관리 전략이 객체의 생애 주기(Lifetime)에 따라 다르게 접근함을 보여주며, 이를 기반으로 다양한 GC 알고리즘(Serial, Parallel, CMS, G1, ZGC 등)이 최적화되어 있다.
이러한 JVM 메모리 구조와 GC의 작동 방식에 대한 이해는 메모리 튜닝, 성능 최적화, OutOfMemoryError 해결 등의 실무 문제를 해결하는 데 필수적인 기반 지식이다.