1 분 소요

자바 메모리 구조는 JVM(Java Virtual Machine)이 운영 체제에서 할당받은 메모리를 메소드 영역, , 스택으로 나눠 관리하는 방식을 말합니다. 이 세 영역을 이해하면 가비지 컬렉션 튜닝, 스레드 안정성 확보, 성능 최적화 등 실제 개발 업무에서 큰 도움이 됩니다.


자바 메모리 구조란?

자바 애플리케이션은 OS 위에서 직접 실행되지 않고 JVM 위에서 동작합니다. JVM은 프로그램 실행 중 필요한 메모리를 용도별로 분리해 관리함으로써 플랫폼 독립성과 안전성을 동시에 확보합니다.


메소드 영역(Method Area)

  • 클래스 메타데이터·정적 변수(static)를 저장
  • 클래스 로딩 시 생성되어 모든 스레드가 공유
  • JDK 8부터는 Metaspace로 관리돼, OS 메모리를 탄력적으로 사용

예시

public class Sample {
    static int counter = 0; // 메소드 영역에 저장
}

힙(Heap)

  • new 키워드로 생성한 모든 객체와 인스턴스 변수 저장
  • Young → Old로 나뉘어 가비지 컬렉터(GC)가 관리
  • JVM 튜닝 시 Xms, Xmx, XX:+UseG1GC 등 힙 관련 옵션을 집중적으로 조정
Test obj = new Test();  // 힙에 객체가 생성
obj.value = 42;

스택(Stack)

  • 메소드 호출 정보·지역 변수·매개변수 보관
  • 스레드마다 독립적으로 존재해 LIFO 방식으로 자동 해제
  • 스택 오버플로우는 재귀 호출 또는 무한 루프에서 주로 발생
public void calc(int n) { // n은 스택에 저장
    int result = n * 2;   // result도 스택
}

JVM 메모리 동작 흐름

  1. 클래스 로딩 → 메타데이터·static 변수 → 메소드 영역
  2. 객체 생성 → 인스턴스·속성 →
  3. 메소드 호출 → 지역 변수·매개변수 → 스택
  4. 가비지 컬렉션 → 참조 없는 객체를 힙에서 회수

왜 자바 메모리 구조를 이해해야 할까?

  • 메모리 누수 진단 및 GC 튜닝
  • 스레드 안전 확보(스택은 스레드별, 힙은 공유)
  • 성능 최적화 – 객체 생명주기 예측으로 생성·해제 비용 절감

요약

영역 주요 저장 데이터 할당 방향 스레드 공유 여부
메소드 영역 클래스 정보, static 변수 고정 공유
객체, 인스턴스 변수 낮은 → 높은 주소 공유
스택 지역 변수, 매개변수, 스택 프레임 높은 → 낮은 주소 독립

질문 정리

  1. 자바 메모리 구조를 모르고도 개발할 수 있나요?

    가능하지만, GC 튜닝·메모리 최적화 작업 시 반드시 필요한 기초 지식입니다.

  2. 힙이 가득 차면 어떻게 되나요?

    가비지 컬렉션 후에도 여유 공간이 없으면 OutOfMemoryError가 발생합니다.

  3. 스택 크기를 늘릴 수 있나요?

    JVM 옵션 -Xss로 스레드당 스택 크기를 조정할 수 있습니다.

  4. 메소드 영역은 더 이상 PermGen이 아닌가요?

    네, JDK 8부터는 Metaspace로 대체돼 PermGen보다 유연하게 메모리를 사용합니다.

  5. 가비지 컬렉션을 완전히 끌 수 있나요?

    • XX:+UseZGC 등 저지연 GC를 선택하거나, 특수 옵션으로 끌 수 있지만 권장되지 않습니다.

카테고리:

업데이트:

댓글남기기