Stay Hungry Stay Foolish

☕ Backend/Java

[Java] 가비지 컬렉터 (Garbage Collector, GC)

devCloud 2026. 4. 2. 12:02
728x90

가비지 컬렉터 (Garbage Collector, GC)와 메모리 관리

1. 가비지 컬렉터란?

프로그램이 동적으로 할당했던 메모리 영역(Heap) 중에서 더 이상 사용하지 않는 객체를 찾아 자동으로 해제해주는 엔진입니다.


2. 왜 필요한가?

메모리 누수(Memory Leak)를 방지하기 위함입니다. 사용이 끝난 메모리를 해제하지 않고 계속 들고 있으면, 시스템의 메모리가 고갈되어 프로그램이 멈추거나 느려집니다. 가비지 컬렉터는 개발자가 실수로 메모리 해제를 빠뜨려도 대신 처리해주어 프로그램의 안정성을 높여줍니다.


3. 언어별 메모리 관리 체계

구분 특징
Managed Language (Java, Python 등) GC가 메모리 관리를 대신 수행합니다. 개발은 편하지만 GC 작동 시 시스템이 일시 정지(Stop-the-world)될 수 있습니다.
Unmanaged Language (C, C++ 등) 개발자가 직접 malloc(), free()로 메모리를 제어합니다. 세밀한 제어가 가능하지만 메모리 누수 위험이 큽니다.

4. 가비지 컬렉터의 한계와 동작 원리

GC가 있다고 만능은 아닙니다.

  • 성능 부하: GC 실행 시점을 예측하기 어렵고, 실행 동안 CPU 자원을 소모합니다.
  • Stop-the-world: 금융, 게임 등 실시간 응답이 중요한 서비스에서는 이 현상이 단점이 됩니다.
  • Reachability (도달 가능성): GC는 '어디서든 참조되고 있지 않은 객체'만을 지웁니다. 논리적으로는 쓸모없어도 참조가 남아있으면 지울 수 없습니다. 이것이 Managed 언어의 메모리 누수 주범입니다.

5. 메모리 관리 실천 꿀팁

"결국 메모리 관리를 잘해야 합니다!"

  • 참조 끊기: 사용이 끝난 대형 객체는 null 처리를 하거나 컬렉션에서 명시적으로 제거하세요.
  • 객체 재사용: 무분별한 new 연산자 사용을 줄이고, 필요하다면 객체 풀(Object Pool)을 사용하세요.
  • 변수 범위(Scope) 최소화: 지역 변수로 선언하여 메서드 종료와 함께 GC 대상이 되도록 설계하세요.
  • static 변수 주의: static으로 선언된 객체는 프로그램 종료 전까지 메모리에 남으므로 꼭 필요한 경우에만 사용하세요.
728x90