안녕하세요, 여행벌입니다.

오늘은 자바 가상 머신의 메모리 모델에 대해서 포스팅 해보겠습니다.


자바 메모리 모델

 자바 가상머신은 운영체제 위에서 실행되는 하나의 프로그램이고, 자바 프로그램은 자바 가상머신 위에서 실행되는 프로그램입니다. 따라서, 자바 가상 머신은 운영체제한테 할당 받은 메모리를 사용해 자바 프로그램이 실행합니다.

 자바 가상 머신은 효율적으로 할당받은 메모리를 사용하기 위해 3개의 영역으로 나눠서 관리합니다.

  메소드 영역, 스택영역, 힙 영역으로 나눠서 데이터를 보관합니다.

1) 메소드영역

 메소드 영역은 메소드의 바이트 코드, static 변수가 저장되는 영역입니다.

 소스파일을 컴파일할 때, 자바 가상머신에 의해 실행이 가능한 코드를 가리켜 '바이트 코드'라고 합니다. 쉽게 말하면 메소드 영역은 특정 클래스의 정보가 담겨있는 영역입니다.

 우리가 인스턴스를 생성하려면 먼저 클래스에 대한 정보가 메모리에 로딩되어있어야 합니다. 이를 클래스의 바이트 코드라고 합니다. 

package Hello;

import java.io.IOException;

class memoryEX{
	static int ex1 = 0;
}

public class test{
	public static void main(String args[]) {
		memoryEX.ex1++;
		new memoryEX();
	}
}

 memoryEX의 static 변수를 참조하고, 인스턴스를 생성하는 코드입니다. 메소드 영역에 memoryEX 클래스에 대한 정보가 로딩되어있기 때문에, 우리가 static 변수를 참조하고, 인스턴스를 생성할 수 있는 것 입니다.

2) 스택 영역

 스택 영역은 지역 변수와 매개 변수가 저장되는 공간입니다. 지역 변수와 매개 변수는 모두 "중괄호로 구분되는 지역 내에서만 유효한 변수들" 입니다. 즉, 중괄호 내에 할당된 이후에 해당 중괄호를 벗어나면 소멸되는 특성의 데이터들이 저장되는 공간입니다.

 또, 스택 영역은 말 그대로 자료구조 스택을 이용해 메모리가 관리됩니다.

package Hello;

public class test{
	public static void main(String args[]) {
		int num1 = 1;
		int num2 = 2;
	}
}

 위의 코드가 컴파일되면 먼저 args 변수가 스택 영역에 쌓이고, num1, num2 변수가 차례대로 스택 영역에 쌓이게 됩니다.

3) 힙 영역

 힙 영역은 인스턴스 정보가 저장되는 영역입니다. 인스턴스는 소멸 시점과 소멸 방법이 지역 변수와 다르기 때문에, 스택 영역과 구분해서 힙 영역에 저장이 됩니다.

 지역 변수와 매개 변수는 중괄호를 벗어나면 변수가 소멸된다고 했습니다. 그럼, 인스턴스는 언제 소멸될까요?? 인스턴스의 소멸시기는 가상머신이 결정합니다. 즉, 가상머신이 "이제 이 인스턴스를 소멸시켜야겠다" 라고 판단하면 인스턴스는 자동으로 소멸이 됩니다. 자바가 다른 프로그래밍 언어에 비해 '메모리 관리에 신경을 덜 써도 된다' 라는 평가를 받는 이유입니다.

 자바에서는 "가비지 컬렉션" 이라는 기능의 인스턴스 소멸 방식을 가지고 있는데, 가비지 컬렉션이 빈번하게 발생하면 시스템에 부담되기 때문에, 자바 가상 머신이 적절한 시기에 가비지 컬렉션을 실행합니다.


 

+ Recent posts