2 분 소요

자바 메서드 메모리 구조는 JVM 내부에서 스택(Stack)·힙(Heap)·메서드(Method) 영역이 어떻게 협력해 메서드 실행을 지원하는지를 설명합니다. 이 구조를 이해하면 스택 오버플로(StackOverflowError)·OutOfMemoryError를 예방하고 성능 최적화에도 큰 도움이 됩니다.


메서드 영역 – 바이트코드와 정적 데이터의 집합

  • 클래스 메타데이터·정적(static) 변수가 저장되는 공유 영역입니다.
  • 메서드 바이트코드와 메서드 레퍼런스(주소)가 여기 있어, 스레드마다 중복 로딩을 막습니다.
  • JDK 8부터는 PermGen 대신 Metaspace가 사용돼 OS 메모리를 유동적으로 활용합니다.

예시

class Counter {
    static int total = 0; // 메서드 영역에 저장
}

힙 영역 – 객체와 인스턴스 변수 저장소

  • new 키워드로 생성된 모든 객체가 위치합니다.
  • Eden → Survivor → Old Generation 순으로 이동하며, 가비지 컬렉터(GC) 가 미사용 객체를 회수합니다.
  • 힙이 가득 차면 Minor GC 또는 Major GC가 발동해 Stop-The-World 지연이 발생할 수 있습니다.

스택 영역 – 스레드별 스택 프레임 관리

  • 메서드 호출 시 스택 프레임이 생성되어 매개변수·지역 변수·리턴 주소·연산 스택을 보관합니다.
  • 호출이 끝나면 프레임이 곧바로 팝(pop)되어 메모리가 자동 반환됩니다.
  • 재귀 깊이가 과도하면 StackOverflowError가 발생합니다.

스택 프레임 구조 한눈에 보기

구역 용도
매개변수 영역 전달된 인수 저장
지역 변수 영역 메서드 내부 int x
연산 스택 산술·논리 연산 임시 값
리턴 주소 호출 종료 후 복귀 위치

메서드 실행 시나리오 실전 예제

class Car {
    String modelName;
    Car(String modelName) { this.modelName = modelName; }
    void printModelName() { System.out.println("모델명: " + modelName); }
}

public class Main {
    public static void main(String[] args) {
        int speed = 60;                 // 스택
        Car myCar = new Car("Tesla");   // 힙(객체), 스택(참조)
        myCar.printModelName();         // 스택 프레임 생성
    }
}
  1. 메서드 영역
    • Car 클래스 바이트코드와 static 정보 로드
  2. 스택(main)
    • speed, myCar 참조 변수 저장
    • Car 객체와 modelName 필드 저장
  3. printModelName 호출
    • 새 스택 프레임이 생성되고 종료 시 즉시 제거

최적화를 위한 메모리 관리 팁

  • 불필요한 참조 해제 → 더 이상 쓰지 않는 객체는 참조 변수를 null로 설정해 GC 대상 지정
  • 지역 변수 최소화 → 큰 배열·객체를 메서드 안에서 반복 생성하지 말고 재사용
  • 재귀 대신 반복문 → 깊은 재귀는 스택 공간을 급격히 소모

질문 정리

  1. 메서드 메모리 구조를 왜 알아야 하나요?

    스택·힙 용량을 예측해 메모리 누수성능 저하를 예방할 수 있기 때문입니다.

  2. 스택 변수와 힙 객체 차이점은?

    스택 변수는 또는 참조만 저장하고 자동 해제되며, 힙 객체는 GC가 회수합니다.

  3. 지역 변수에 null 대입이 GC 성능을 높이나요?

    스코프가 넓은 변수(예: 메서드 끝까지 살아남는 배열)일 때는 null로 초기화하면 GC가 더 빨리 회수할 수 있습니다.

  4. 메서드 영역도 GC 대상인가요?

    네, Metaspace는 클래스 언로딩 시 GC의 영향을 받지만 빈도가 낮습니다.

  5. Xss 옵션을 늘리면 성능이 좋아지나요?

    지나치게 크면 메모리 낭비, 작으면 StackOverflow 위험이 있으므로 스레드 수·호출 깊이에 맞춰 적절히 조정해야 합니다.

카테고리:

업데이트:

댓글남기기