본문 바로가기

# 02/Java

[윤성우 열혈자바] 19-1. 자바 가상머신의 메모리 모델

반응형

운영체제 입장에서 자바 가상머신


운영체제의 관점에서는 가상머신도 그냥 프로그램의 하나.



운영체제가 일반 프로그램에게 4G 메모리 공간을 할당해준다면,


JVM에게도 4G 메모리 공간을 할당해준다.



자바 프로그램에 두 개 실행되면, 가상머신도 두 개가 실행된다.


이는 메모장을 두 번 띄우면 두 개의 메모장 프로그램이 실행하는 이치와 같다.








자바 가상머신의 메모리 모델


  • 메소드 영역 (Method Area)

메소드의 바이트코드, static 변수


  • 스택 영역 (Stack Area)

지역변수, 매개변수


  • 힙 영역 (Heap Area)

인스턴스




메모리 공간 활용의 효율성을 높이기 위해 메모리 공간을 이렇듯 세 개의 영역으로 구분하였다.









메소드 영역


class Boy {

static int average = 0;


public void Run() { . . . }

}


class MyMain {

public static void main(String[] args) {

Boy b = new Boy();                // 인스턴스 생성

Boy.average += 5;                 // 클래스 변수 접근

. . . .

}

}


메소드 영역 : 바이트코드와 static 변수가 할당되는 메모리 공간


이 영역에 저장된 내용은 프로그램 종료 시 소멸된다.








스택 영역 - 임시저장


public static void main (String[] args) {


int num1 = 10;

int num2 = 20;


adder(num1, num2);


System.out.println("end of program");

}


public static void adder(int n1, int n2) {


int result = n1 + n2;


return result;

}


스택 영역 : 지역변수 매개변수 할당되는 영역


이 영역에 저장된 변수는 해당 변수가 선언된 메소드 종료 시 소멸된다.







 

힙 영역 - 인스턴스를 저장하는 영역


public static void simpleMethod() {


String str1 = new String( "My String" );

String str2 = new String( "Your String" );


. . .


}


힙 영역 : 인스턴스가 저장되는 영역


가비지 컬렉션의 대상이 되는 영역이다.



인스턴스를 힙 영역에 따로 저장하는 이유는 여러개의 참조변수가 한 인스턴스를 참조하고 있을 수 있어 한 참조변수가 사라진다고 해서 함부로 인스턴스를 삭제하면 안된다. 


그래서 스택이 아닌 힙 영역에 따로 관리하는 것이다.


따라서 힙 영역은 가비지 컬렉션으로 조심스럽게 지우는 것이다!!








자바 가상머신의 인스턴스 소멸 시기


public static void simpleMethod() {


String str1 = new String ( "My String" );

String str2 = new String ( "Your String" );


. . . .


str1 = null;                // 참조 관계 소멸

str2 = null;                // 참조 관계 소멸


. . . .

}



참조 관계가 끊어진 인스턴스는 접근이 불가!


따라서 가비지 컬렉션의 대상이 된다.




반응형