운영체제 입장에서 자바 가상머신은 일반프로그램과 동일한 프로그램 중 하나이므로
자바 프로그램이 두 개 실행되면, 가상머신도 두 개가 실행 됩니다.
각 가상머신마다 운영체제가 메모리를 할당합니다.
자바는 해당 메모리를 효율적으로 관리하기 위해 영역을 나눕니다.
- 메소드 영역 (Method Area) - 메소드의 바이트코드, static 변수
- 스택 영역 (Stack Area) - 지역변수, 매개변수
- 힙 영역 (Heap Area) - 인스턴스
- 코드 영역(Code 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;
}
스택은 FILO = First In Last Out (처음 들어간 것은 나중에 나옵니다.)
지역변수 매개변수 할당되는 영역입니다.
이 영역에 저장된 변수는 해당 변수가 선언된 메소드 종료 시 소멸됩니다.
● 힙 영역
public staic void simpleMethod() {
String str1 = new String("My String");
String str2 = new String("Your String");
....
}
인스턴스가 저장되는 영역입니다.
참조변수가 참조한다고 할 때의 영역입니다.
인스턴스를 생성할 때 인스턴스를 참조하는 것은 변수 입니다.
참조 변수로써 지역변수인 str1 과 str 2는 스택에 쌓입니다.
스택의 변수들이 참조하는 실제 인스턴스들의 대상은 힙 영역에 쌓입니다.
힙 영역은 가비지 컬렉션의 대상이 되는 영역 입니다.
인스턴스로써 역할과 값이 없는 데이터, 쓸모가 없는 데이터가 만들어지면 가비지 컬렉터라는 작업으로
가비지 컬렉션에 들어갑니다.
즉, 아무도 찾지 않는 버려진 인스턴스가 발생하게 되면, 자바의 가비지 컬렉터가 이를 탐지하여 가비지 컬렉션에 모아 둡니다. 그리고 나중에 소멸시켜 버린다. (메모리 낭비를 최소화할 수 있다.)
public staic void simpleMethod() {
String str1 = new String("My String");
String str2 = new String("Your String");
....
str1 = null; // 참조 관계 소멸
str2 = null; // 참조 관계 소멸
....
}
null 은 null pointer 라고도 하며 아무것도 참조하지 않은 상태로 만듭니다.
참조 관계가 끊어진 인스턴스는 접근이 불가하므로 가비지 컬렉션의 대상이 됩니다.
가비지 컬렉션에 들어간 인스턴스는 즉각 소멸되지는 않습니다.
가비지 소멸 또한 프로그램에 부하를 주는 일이므로 가비지 컬렉터 자체적인 알고리즘에 의해 적절한 시기에 가비지 인스턴스를 소멸시킵니다.
따라서 정확하게 소멸하는 타이밍을 명시할 수는 없습니다.
가비지 컬렉션에 인스턴스가 있다고 해도, 프로그램 소멸 되면 해당 인스턴스들은 알아서 함께 소멸됩니다.
'자바 > 자바 입문 공부일지' 카테고리의 다른 글
자바 기초 공부 일지 31. 래퍼 클래스, Number 클래스 (0) | 2022.11.01 |
---|---|
자바 기초 공부 일지 30. clone 메소드 (0) | 2022.11.01 |
자바 기초 공부 일지 28. 예외의 처리 try~catch 구문 (0) | 2022.11.01 |
자바 기초 공부 일지 27. 추상 클래스 (0) | 2022.10.31 |
자바 기초 공부 일지 26. 인터페이스interface , 구현implements (0) | 2022.10.31 |