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