Development/Java

Java 메모리 구조와 가비지 컬렉션 완벽 가이드

최라온 2025. 5. 14. 15:46
728x90
반응형
SMALL

Java 메모리 구조와 가비지 컬렉션 완벽 가이드

Java는 자동 메모리 관리를 지원하는 언어로, 개발자는 직접 메모리를 해제할 필요 없이 안정적인 프로그램을 작성할 수 있습니다. 이 글에서는 JVM 메모리 구조, 스택과 힙의 차이, 가비지 컬렉션(GC) 동작 방식까지 핵심 개념을 설명합니다.

1. JVM 메모리 구조

Java 프로그램은 JVM(Java Virtual Machine) 위에서 실행되며, 메모리는 크게 아래와 같이 구성됩니다.

  • Method Area: 클래스 정보, static 변수, 상수 저장
  • Heap: 객체가 저장되는 영역 (GC의 대상)
  • Stack: 메서드 호출 시 지역 변수와 호출 정보 저장
  • PC Register: 현재 실행 중인 명령의 주소
  • Native Method Stack: C/C++ 등 네이티브 코드 실행 시 사용

2. 스택(Stack)과 힙(Heap) 차이

스택: 메서드 호출 시 생성되는 지역 변수 저장소로, 메서드 종료 시 자동 해제됩니다.

힙: new 연산자를 통해 생성된 객체가 저장되는 공간으로, 가비지 컬렉터가 주기적으로 관리합니다.

3. 객체 생성과 메모리 흐름

public class User {
    String name;
}

public static void main(String[] args) {
    User u = new User(); // u는 스택, new User()는 힙에 생성됨
}

4. 가비지 컬렉션(Garbage Collection)

GC는 더 이상 참조되지 않는 객체를 힙에서 자동으로 제거해주는 메커니즘입니다. Java는 다양한 GC 알고리즘을 지원합니다.

  • Serial GC: 단일 스레드, 작은 애플리케이션에 적합
  • Parallel GC: 다중 스레드, Throughput 중심
  • G1 GC: 짧은 지연 시간 + 병렬 처리 (Java 9+ 권장)
  • ZGC, Shenandoah: 초저지연 GC (Java 11+)

5. GC 동작 방식 (Mark and Sweep)

  1. Mark: 살아있는 객체 식별
  2. Sweep: 참조되지 않는 객체 제거
  3. Compact: 메모리 조각화 방지를 위해 재배치

6. 강한 참조 vs 약한 참조

  • Strong Reference: 일반 참조, GC 대상 아님
  • WeakReference: GC가 즉시 회수 가능
  • SoftReference: 메모리 부족 시 회수
  • PhantomReference: 객체 소멸 이후 후처리에 사용

7. 메모리 누수 주의 사항

  • static 변수로 객체 계속 참조
  • 콜백 리스너 등록 후 제거하지 않음
  • 캐시, 컬렉션 등에서 불필요한 참조 유지

8. 결론

Java는 자동 메모리 관리 덕분에 개발자 부담이 적지만, JVM 구조와 GC의 동작 원리를 이해하면 메모리 효율과 성능을 최적화할 수 있습니다. GC 튜닝이나 메모리 누수 방지를 위해 구조적 이해는 필수입니다.

728x90
반응형
LIST