JVM은 OS로부터 메모리를 할당 받는다. 그리고 할당 받은 공간을 ‘Runtime Data Area’라고 한다.
할당 받은 공간을 5영역으로 나누어 관리한다.
Class Area(=Method Area) 란?
- 클래스 파일의 바이트 코드가 로드되는 곳
* 클래스 로딩이 이뤄지는 이유는 어떤 메소드가 호출되려면 먼저 그 메소드를 갖고 있는 클래스 파일이 메모리에 로딩되어야 한다. 그래서 클래스를 실행할 때 .class 파일을 찾아서 메모리가 로딩하는 것이다.
스택 영역(Stack Area)
- 지역변수와 매개변수가 저장되는 곳
- 프로그램의 실행 과정에서 ‘임시로 할당’되고, 그게 끝나면 바로 소멸되는 것들이 저장된다. 즉, 메소드가 호출될 때마다 그 메소드의 로컬 변수를 준비하고 메소드 호출이 끝나면 그 메소드를 위해 준비했던 모든 변수가 스택에서 제거된다.
- 기본(literal)타입 변수는 스택 영역에 직접 값을 가진다.
- 참조타입 변수는 힙영역이나 메소드 영역의 객제 주소를 가진다.
public class StackMemoryTest {
public static void test1(int a){
test2(++a)
System.out.printf(“test1() : %d\n”, a);
}
public static void test2(int a) {
++a
System.out.printf(“test2() : %d\n”, a);
}
public static void main (String[] args ) {
int a = 1;
test1(a)
System.out.printf(“main() : %d\n”, a);
}
}
결과
test2() : 3 test1() : 2 main() : 1
힙 영역 (Heap Area)
- New 연산자로 생성된 객체 또는 생성되어 있는 객체가 저장되어 있고, Java constant pool 존재
- 스택 영역에 저장된 로컬 변수, 매개 변수와 달리 힙 영역에 보관되는 메모리는 메소드 호출이 끝나도 사라지지 않고 가비지 컬렉터에 의해 지워질 때까지 또는 JVM이 종료될 때까지 유지된다.
- 인스턴스를 별도의 힙 영역에 할당하는 이유는 인트턴스의 소멸 방법과 소멸시점이 지역변수(스택영역에 할당되는 변수)와 다르기 때문이다.
- 8가지 literal 변수를 제외한 그외의 타입으로 정의된 변수들은 모조리 참조변수이다. 이런 참조 변수들은 실행될 때마다 많은 데이터들을 스택 메모리 영역에 뒀다 뺐다 하는게 매우 비효율적이므로, 힙 영역에 그 내용(진짜 값)이 저장되고, 스택 메모리에는 간단하게 그 주소만 저장이 되는 것이다.
[참고] literal type
https://velog.io/@locodingve/Java-DataType
참고 사이트 :