Java 프로그램을 실행하면,
JVM(Java Vitrual Machine)은 운영체제로부터 메모리를 할당받는다.
JVM은 이 메모리를 메소드 영역, 힙 영역, 스택 영역으로 구분하여 사용한다.
컴파일 된 바이트 코드(.class)들이 저장된다.
이 때, 클래스별로 코드들을 분류하여 저장한다.
◾️ 정적 필드(static field)
◾️ 상수(constant)
◾️ 생성자(constructor)
◾️ 메소드(method) 등
모든 스레드가 공유하는 영역이며, 객체(힙 영역)를 만들거나 변수(스택 영역)를 생성하는 용도로 사용한다.
생성 과정
1. 소스 코드 작성 (.java)
2. 컴파일 : 바이트 코드 파일 생성 (.class)
3. 자바 프로그램을 실행하면 바이트 코드 파일이 메소드 영역에 로딩된다.
loading(로딩) : 바이트 코드 파일을 메소드 영역에 저장
객체와 배열이 저장된다.
힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수에서 참조한다.
참조를 잃어버린 객체나 배열은 변수가 꺼내올 수 없으므로(사용불가)
자동으로 Garbage Collector(쓰레기 수집기)에 의해 힙 영역에서 제거된다.
각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다.
메소드를 호출할 때 프레임이 생성되며, 해당 프레임은 메소드가 종료될 때 제거된다.
프레임 내부에는 메소드를 호출할 때 메소드 안에서 사용되는 변수들이 저장된다.
프레임은 메소드가 실행될 때만 존재하며, 추가된 프레임은 stack 형태(위-아래)로 쌓인다.
기본 타입의 스택 영역
변수는 선언된 블록 안에서만 존재하며, 선언된 블록이 끝나면 소멸된다.
선언된 블록이 아닌 외부에서 사용할 수 없다.
void method() {
// ①
char var1 = 'A';
// ②
if (var1 == 'A') {
int var2 = 100;
double var3 = 3.14;
} // 선언된 블록이 끝나면 소멸
// ③
boolean var4 = true;
}
참조 타입의 스택 영역
변수는 스택 영역에 생성되지만, 배열의 데이터는 힙 영역에 생성되므로 소멸되지 않는다.
void method() {
int[] scores = {10, 20, 30};
}
혼공자 강의를 기반으로 작성하였습니다. 🙏
20강