본문 바로가기
Daily Dev Q&A 정리 템플릿

25.11.26 자바 메모리 구조

by teg0 2025. 11. 26.

자바 메모리 구조

JVM은 OS로부터 메모리를 할당받고, 그 메모리를 용도에 따라 크게 3가지 영역으로 나누어 관리한다.

Method(Static) 영역, Stack 영역, Heap 영역으로 구분되며, 데이터 타입에 따라 각 영역에 나눠서 할당된다.

 

 

자바 변수 종류

public class VariableExample {

    // 2. 인스턴스 변수
    int instanceCount = 10;

    // 3. 클래스 변수 (static 변수)
    static int totalCount = 100;

    // 4. 매개변수(parameter) 사용
    public void printValues(String name) {
        // 1. 지역 변수
        int localValue = 5;

        System.out.println("이름: " + name);              // 매개변수
        System.out.println("지역 변수: " + localValue);   // 지역 변수
        System.out.println("인스턴스 변수: " + instanceCount);
        System.out.println("클래스 변수: " + totalCount);
    }

    public static void main(String[] args) {
        VariableExample obj = new VariableExample();
        obj.printValues("동호");
    }
}
변수명 선언위치 설명
클래스 변수 클래스 영역 클래스 영역에서 타입 앞에 static이 붙는 변수
객체를 공유하는 변수로 여러 객체에서 공통으로 사용하고 싶을 때 정의
static을 미리 붙이면, 코드보다 먼저 실행
인스턴스 변수 클래스 영역에서 static이 아닌 변수
개별적인 저장 공간으로 객체/인스턴스마다 다른 값 저장 가능
지역 변수 메서드 영역 메서드 내에서 선언되고 메서드 수행이 끝나면 소멸되는 변수
초깃값을 지정한 후 사용할 수 있음
매개 변수 메서드 호출 시 전달하는 값을 가지고 있는 인수
지역 변수처럼 선언된 곳부터 수행이 끝날 때까지 유효함

 

각 변수의 생성 시기

  • 클래스 변수는 클래스가 메모리에 올라갈 때
  • 인스턴스 변수는 인스턴스가 생성되었을 때
  • 지역 변수와 매개 변수는 위치하고 있는 메서드가 수행되었을 때

 

Method(Static) 영역

JVM이 동작해서 클래스가 로딩될 때, 생성되는 영역으로 클래스와 인터페이스에 대한 상수(리터럴 풀), 멤버 변수(필드), 클래스 변수(Static 변수), 상수(final), 생성자(Constructor)와 메서드(Method) 등을 저장하는 공간이다.

public class MethodAreaExample {

    // 메서드 영역에 저장되는 static 변수
    static int staticCount = 100;

    // 메서드 영역에 저장되는 static 메서드
    public static void printStatic() {
        System.out.println("staticCount = " + staticCount);
    }

    public static void main(String[] args) {
        // 문자열 리터럴도 메서드 영역의 String Constant Pool에 저장됨
        String msg = "Hello"; 
        printStatic();
    }
}

 

Stack 영역

원시타입(int, double, byte, long, boolean 등)에 해당하는 지역 변수, 매개 변수, 참조 변수 저장된다.

메서드 내에서 정의하는 기본 자료형에 해당되는 지역변수의 데이터값이 저장되는 공간이다.

메서드가 호출될 때 메모리에 할당되고 메서드가 종료되면 메모리에서 제거된다.

Stack은 후입선출(LIFO; Last - In - First - Out)의 특성을 가지며, 스코프 범위를 벗어나면 스택 메모리에서 사라진다.

public class StackAreaExample {

    public void calculate(int x) { // x = 매개변수 → 스택
        int y = 10;               // 지역변수 → 스택
        int result = x + y;       // 지역변수 → 스택

        System.out.println(result);
    }

    public static void main(String[] args) {
        StackAreaExample obj = new StackAreaExample(); // obj는 참조 변수 → 스택
        obj.calculate(5);
    }
}

new StackAreaExample()은 힙 영역에서 생성된다.

 

Stack Frame

메서드 호출될 때 스택 영역에 스택 프레임이 생기고 그 안에 메서드를 호출하게 되는데,

여기서 스택 프레임은 프로그램 실행 중 함수가 호출될 때 스택 메모리 영역에 생성되는 그 함수만을 위한 독립적인 메모리 공간이다. 함수가 종료되면 해당 스택 프레임은 스택에서 제거되고 메모리에서도 제거된다.

독립적인 메모리 공간을 사용하여, 서로의 데이터에 영향을 주지 않는다.

스택 프레임 result
int y
int x

 

Heap 영역

JVM이 관리하는 프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 영역이다.

Heap 영역은 new 연산으로 생성되는 객체(인스턴스)와 배열 등이 저장되는 공간으로, 여기에 생성된 데이터는 동적으로 관리되며 GC의 대상이 된다. 하지만, 이 객체를 가리키는 참조 변수는 Stack 영역에 저장된다.

public class HeapAreaExample {

    // 인스턴스 변수 → 객체가 만들어질 때 힙에 저장
    int value = 42;

    public static void main(String[] args) {

        // new로 만든 객체 → 힙에 생성
        HeapAreaExample obj = new HeapAreaExample();

        // 배열도 힙에 저장
        int[] numbers = new int[3]; 

        numbers[0] = 1;  // 힙에 있는 배열에 값 저장
        numbers[1] = 2;
        numbers[2] = 3;

        System.out.println(obj.value); 
    }
}

 

면접 답변식 요약

JVM이 OS로부터 받은 메모리는 Method Area(Static), Stack, Heap 세 영역으로 나뉩니다.

Static(Method) 영역은 클래스와 인터페이스에 대한 필드를 저장하는 공간입니다.

Stack 영역원시 타입인 매개 변수, 지역 변수 데이터 값이 저장되는 영역이며, 후입선출의 특성을 가집니다.

메서드가 호출될 때 메모리에 할당되고 메서드가 종료되면 메모리에서 제거됩니다.

Heap 영역은 프로그램을 실행 시 동적으로 할당하여 사용하는 영역으로, new 연산을 통해 생성된 객체와 배열 등이 저장되는 공간이다. 여기서 생성된 데이터는 동적으로 관리되며 GC의 대상이 됩니다.