운영체제 입장에서 자바 가상머신
운영체제의 관점에서는 가상머신도 그냥 프로그램의 하나.
운영체제가 일반 프로그램에게 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; // 참조 관계 소멸
. . . .
}
참조 관계가 끊어진 인스턴스는 접근이 불가!
따라서 가비지 컬렉션의 대상이 된다.
'# 02 > Java' 카테고리의 다른 글
[윤성우 열혈자바] 20-1. 래퍼 클래스 (0) | 2019.10.23 |
---|---|
[윤성우 열혈자바] 19-2. Object 클래스 (0) | 2019.10.23 |
[윤성우 열혈자바] 18-2. 예외처리에 대한 나머지 설명들 (0) | 2019.10.22 |
[윤성우 열혈자바] 18-1. 자바 예외처리의 기본 (0) | 2019.10.22 |
[윤성우 열혈자바] 17-2. 인터페이스의 문법 구성과 추상 클래스 (0) | 2019.10.22 |