JVM의 메모리 모델 (JVM이 사용하는 메모리 영역 4가지)

Kyu·2021년 1월 10일
1

Java 공부기록

목록 보기
5/40

들어가기에 앞서서 아래 정리한 내용은 정확하게는 Runtime Data Area에서 Method Area, Heap Area, Stack Area의 관한 내용을 정리한 내용이라고 볼 수 있다. 그러므로 개념에 관해서 더 정확하고 개연성을 붙이려면 서치해보아야 한다.

하지만 서치해보면 알아야할 부분들이 좀 방대하다. 작성한 코드가 메모리에서 어떻게 돌아가는지 윤곽을 잡는다는 접근으로 다가가면 괜찮을 듯하다.


JVM이 어떤 절차를 가지고 클래스를 실행하는지 알아보자.

JVM이 실행될 때 필요로하는 네가지의 종류의 메모리 영역이 있다:
Method Area
Stack Area
Heap Area
Literal Pool

이것을 이용해서 프로그램 (클래스)을 동작시킨다.

예를들어서

public class TPC08{
	public static void main(String[] args){
		int a = 10; int b = 20;
		int v = add(a, b);
		System.out.println(v);
	}
	public static int add(int a, int b) {
	int sum = a+b;
	return sum;
	}
}

라는 코드가 있을 때, 여기서 static이 어떤 역할을하는지 JVM의 메모리 영역에서 설명할수있다.

먼저 TPC08를 실행하면 먼저 JVM이 구동이 된다.

JVM이 TPC08(실행클래스)를 실행하는 절차:

  1. 해당클래스를 현재 디렉토리에서 찾는다. - >성공 or 실패 -> 실패시 환경변수에 classpath라는 변수를 만들고 클래스가 있는 폴더를 경로를 classpath에 잡아주면 찾아줄수있다. 하지만 대부분 현재 디렉토리에서 찾아서 성공한다.

  2. 찾으면 클래스 내부에 있는 static 키워드가 있는 메소드들을 method Area의 static zone으로 기계어 코드가 자동 로딩된다. static이 붙어 있지 않으면 method Area 내의 non-static zone 으로 로딩된다.

  3. static zone에서 main() 메소드를 실행한다. main() method가 호출되면 main() method의 호출정보가 stack area에 들어간다, 맨처음에는 stack area에 아무것도 없다가 (프로그램이 실행되고 있지 않다는 의미) 메소드가 호출이되면 stack에서 영역을 할당받아서 stack에 저장이된다. stack에서 프로그램이 동작이 된다. 프로그램카운터가 main a = 10 b = 20 v 30을 가리킨다. 프로그램카운터가 가리키는부분이 현재 동작되는 부분이라고 이해하면된다

앞전에 a와 b가 메모리에 저장된다고 한것은 바로 stack Area에 저장된다는것을 의미한다. 메소드가 호출 될 때마다 각 각의 스택 프레임이 생성 되고, 그 스택 프레임 안의 변수들은 그 안에서만 사용되어 질수 있다. 그래서 그걸 지역local이라 하고 a, b, v를 지역변수라고 한다. 그래서 main이 같은 static zone에서 add 메소드를 찾는다. 만약 add가없으면 main이 add를 호출할수없기때문에 에러난다.

main이 method Area에 올라오고 add가 method Area에 올라올때 add가 stack Area에 호출정보가 간다. 그때 프로그램카운터(PC)가 1증가하면서 main을 가리키고있다가 add를 가리키게 되면서 add가 동작하고있다고 할수있다. add가 끝나면 stack에서 add가 빠져나간다 프로그램카운터도 main으로 다시 내려온다. main에서 v값을 출력하고 main도 빠져나가고 stack area에 아무것도없으므로 프로그램이 종료된다. 그래서 stack Area는 LIFO 구조를 가진다 Last In First Out. 예를들어 여기서는 add가 마지막으로 들어가고 처음으로 나온다.

static이 없는경우는?

public class TPC09{
	public static void main(String[] args){
		int a = 10; int b = 20;
		Test test = new Test();
		int v = test.add(a, b);
		System.out.println(v);
	}
	public int add(int a, int b) {
	int sum = a+b;
	return sum;
	}
}

add()는 non-static zone에 올라오게 된다. 하지만 사실은 heap Area에 add가 생기면서 method Area에 있는 add를 가리키는 형식이다. add를 가리키면 stack Area에 add가 생성이 된다.

profile
TIL 남기는 공간입니다

1개의 댓글

comment-user-thumbnail
2021년 1월 10일

와우 큐 정리 대박...👍👍

답글 달기