2. 기초_변수와 메소드가 JVM에 저장되는 위치

Java에서 변수는 선언 위치에 따라서 JVM 메모리의 어디에 저장되는지 달라집니다.

JVM 메모리는 크게 여러 영역으로 나뉘며, 각 영역의 역할과 변수 저장 위치는 다음과 같습니다.

스택 메모리 (Stack Memory)

  • 메서드 내에서 선언된 기본 자료형 변수는 스택 메모리에 저장

  • 스택 메모리는 각 메소드 호출 시마다 프레임이 생성되며, 로컬 변수는 이 프레임에 저장

  • 메소드가 호출될 때마다 새로운 스택 프레임이 생성되고, 메소드 실행이 완료되면 해당 스택 프레임은 사라짐

public void exampleMethod() {
    int localVar = 10; // localVar는 스택 메모리에 저장됨
}

힙 메모리 (Heap Memory)

  • 클래스의 인스턴스 변수는 객체가 생성될 때 힙 메모리에 저장

  • int와 같은 기본 자료형도 객체의 필드로 사용될 때는 힙 메모리에 저장

public class ExampleClass {
    int instanceVar = 20; // instanceVar는 힙 메모리에 저장됨
}

메소드 영역 (Method Area)

  • 클래스의 메타데이터, 메서드 정의, 정적 변수 등은 메소드 영역에 저장

  • 메소드 영역은 클래스 로더가 클래스를 로드할 때 생성

  • 상수 풀(Contant Pool): 클래스의 상수 final로 선언된 변수도 메소드 영역에 저장

  • final이 붙은 메소드도 메소드 영역에 저장

요약

  • 메서드 내에 선언된 기본 자료형(int 변수, 즉, 로컬 변수): 스택 메모리에 저장

  • 클래스의 인스턴스 변수(객체 필드): 힙 메모리에 저장

  • 클래스의 정적 변수(static 변수): 메소드 영역에 저장

  • 클래스 객체, 배열, 컬랙션(Hash/Tree): 힙 메모리에 저장

  • 메소드: 메소드 영역에 저장

  • 인스턴스 메소드 내에 선언된 final 변수는 로컬 변수로 간주하며 스택 메모리에 저장됩니다.

public class ExampleClass {
    int instanceVar;
}

public void exampleMethod() {
    ExampleClass obj = new ExampleClass(); // obj는 힙 메모리에 저장됨
    int[] array = new int[10]; // array도 힙 메모리에 저장됨
}

힙 메모리는 동적으로 할당된 메모리 영역으로 가비지 컬렉션을 통해 관리됩니다.

스택 메모리 동작 방식

  • 메소드 호출: 인스턴스 메소드가 호출될 때 마다 JVM은 호출 스택에 새로운 스택 프레임을 생성

  • 로컬 변수 저장

  • 메소드 종료: 메소드 호출이 종료되면 해당 스택 프레임은 제거되고, 로컬 변수도 스택 메모리에서 사라짐

Last updated