java.exe로 JVM이 실행되고 JVM은 운영체제에서 할당받은 메모리 영역을 메소드, 힙, 스택 영역 등으로 세분하게 구분화해 사용한다. 이때 메모리 영역을 Runtime Data Area라고 부른다.
- Method Area(메소드 영역)
- 코드에서 사용되는 클래스(~.class)들을 클래스 로더로 읽어 클래스 별로 상수풀(runtime constant pool), 필드 데이터, 메소드 데이터, 메소드 코드, 생성자(construcotr) 코드 들을 분류해 저장한다. 이 영역은 JVM이 시작될 때 생성된다. 또한 모든 스레드가 공유한다.
- Heap Area(힙 영역)
- 힙 영역은 객체와 배열이 생성되는 영역이다. 이곳에서 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다. 만약 참조하는 변수나 필드가 없다면 그 객체는 의미 없는 객체인 쓰레기 객체가 되어 JVM의 쓰레기 수집기능을 담당하는 Garbage Collector가 실행되어 쓰레기 객체를 힙 영역에서 삭제한다. 이러한 이유로 개발자들은 별도의 객체 제거 코드를 작성하지 않아도 된다.
- Stack Area(스택 영역)
- 스택 영역은 각 스레드 마다 하나씩 존재한다. 스레드가 시작되면 스택 영역이 할당된다.
- 예를 들어 자바 프로그램에서 별도의 스레드를 생성하지 않은 경우, 스레드는 main 스레드 하나만 존재하게 되고 이에 따라 JVM의 스택도 하나이다.
- 스택 영역에서는 메소드를 호출할 때마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거하는 동작을 수행한다.
public class Main{
public static void main(String[] args) {
char ex1 = 'A';
if(ex1=='A') {
int ex2 = 1;
}
double ex3 = 3.14;
}
}
다음과 같은 코드가 있다고 한다면 main 스레드의 JVM 스택 영역은 다음과 같이 변한다.
if 들어가기 전 | if문 들어와서 | if문 빠져나와서 | |||
ex1 | A | ex2 | 1 | ex3 | 3.14 |
ex1 | A | ex1 | A |
- PC Register(PC 레지스터)
- 스레드가 생성될 때마다 생성되는 영역이다.
- 현재 스레드가 실행되는 부분의 주소롸 명령을 저장하고 있다.
- 이를 활용해 스레드를 돌아가면서 수행 할 수 있게 해 준다.
- Native Method Stack
- 자바 이외의 언어로 작성된 네이티브 코드(c, c++ 등)를 위해, 이를 수행하기 위한 메모리 영역이다.
'Java' 카테고리의 다른 글
[JAVA] 패키지(package), import문 (0) | 2021.05.06 |
---|---|
[JAVA]final 키워드와 상수(static final)의 이해 (0) | 2021.05.06 |
[JAVA]싱글톤(Singleton)과 getInstance()메소드 (0) | 2021.05.06 |
[JAVA]정적 멤버와 static, 정적 블록 (0) | 2021.05.05 |
[Java] JVM에 대한 이해와 설치 (0) | 2021.05.05 |