JVM은 OS에서 할당받은 메모리 영역을 세 셩역으로 구분
- 변수는 스택 영역에 생성 되고
- 객체는 힙 영역에 생성됨
JVM이 시작되면 JVM은 운영체제에서 할당받은 메모리 영역을 다음과 같이 세부 영역으로 구분해서 사용한다.
메소드 영역에는 코드에서 사용되는 클래스(*.class) 들을 클래스 로더로 읽어 클래스 별로 런타임 상수풀, 필드 데이터, 메서드 데이터, 메서드 코드 생성자 코드 등으로 분류해서 자장한다.
힙 영역은 객체와 배열이 생성되는 영역이다. 힙 영역에서 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 클래스의 필드에서 참조한다. 참조하는 변수나 필두가 없다면 의미 없는 객체가 되기 때문에 이것을 쓰레기 취급하고 JVM GC를 실행시켜 쓰레기 객체를 힙 영역에서 자동으로 제거한다.
JVM Stack Area는 각 스레드마다 하나씩 존재하며 스레드가 시작될때 할당된다. 자바 프로그램에서 추가적으로 스레드를 생성하지 않았다면 main 스레드만 존재 하므로 JVM 스택도 하나이다.
JVM 스택은 메서드를 호출할 때마다 프레임(Frame)을 추가 (push) 하고 메서드가 종료되면 해당 프레임을 제거 (pop)하는 동작을 수행한다.
예외 발생 시 printStackTrace() 메서드로 보여주는 Stack Trace의 각 라인은 하나의 프레임을 표현한다.
프레임 내부에는 로컬 변수 스택이 있는데, 기본 타입 변수와 참조 타입 변수가 추가(push)되거나 제거(pop)된다. 변수가 이 영역에 생성되는 시점은 초기화가 될 때, 즉 최초로 변수에 값이 저장될때이다. 변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거된다.
char v1 = 'A'; // (1)
if(v1 == 'A'){ // (2)
int v2 = 100;
dobule v3 = 3.14;
}
boolean v4 = true; // (3)
선언된 변수는 실행 순서에 따라서 위 그림과 같이 스택에 생성되고 소멸된다.
v2와 v3은 if 블록 내부가 실행되고 있을 때만 스택 영역에 존재하고 실행 흐름이 if 블록을 빠져나가면 소멸된다.
(1). java MemoryExample (클래스 이름)
(2). JVM 구동
(3). MemoryExample 로딩
(4). main 스레드 생성
(5). main 메소드 실행
(6). public static void main(String[] args) {
(7) int num = 0;
}
- java exe로 클래스 실행
- JVM 이 구동됨
- Runtime Data Area 생성
- Method Area 생성
- Heap Area 생성
- Runtime Data Area 생성
- MemoryExample 로딩 : 바이트 코드 로딩
- 클래스에대한 내용이 올라감
- 메서드에 대한 코드, 필드 내용, 생성자 등등..
- 코드 자체가 올라가는 것은 아님, 해당 코드를 분석해서 올림
- main 스레드 생성
- 메인 메서드를 실행 시키는 코드 흐름을 의미
- 메인 메서드를 실행 시키면 내부적으로 내부적으로 메인 메서드가 생성되고 메인 스레드가 메인 메서드를 호출함
- 메인 스레드가 생성됨과 동시에 JVM Stack이 생성됨
- main 메서드 호출
- JVM Stack에 프레임 하나가 생성됨
- public static void main(String[] args)
- String[] args : 프레임 내부에 생성됨 배열 객체이니 Heap Area에 생성됨
- int num = 0 : 프레임 내부에 push 됨
- JVM을 시작할때 생성
- 로딩된 클래스 바이트 코드 내용을 분석후 저장
- 모든 스레드가 공유
클래스 1
-------
런타임 상수풀
필드/메소드 데이터
메소드 코드
생성자 코드
- JVM을 시작할 때 생성
- 객체/배열 저장
- 사용되지 않은 객체는 GC가 자동 제거
객체 1 객체 2 객체 3 객체 4 객체.....
객체 5 객체 6 객체 7 객체 8 객체.....
- 스레드 별로 생성
- 메소드를 호출할 때마다 Frame을 스택에 추가 Push
- 메소드가 종료하면 Frame을 제거 (pop)
pop
----
변수 - n
----
변수 - 1
----
1. java MemoryExample (클래스 이름)
2. JVM 구동
3. MemoryExample 로딩
4. main 스레드 생성
5. maun 메소드 실행
6. public static void main(String[] args) {
}
JVM이 구동 될때 운영체에서 받은 메모리 영역을 Runtime Data Area가 생성됨 이 때 메소드 영역, 힙 영역이 생성된다.
바이트 코드를 로딩, 메소드 영역에 클래스에 대한 내용이 올라감, 메소드의 코드, 필드 내용 등이 올라감 코드 자체가 그대로 올라가는 것이 아니라 코드를 분석한 내용이 올라간다고 보면된다.
메인 메소드를 실행 시키는 코드 흐름을 말함, 메인 메소드를 실행했을 경우 내부적으로 main 스레드가 생성되고 메인메소드를 실행 시켜준다.
main 스레드가 생성되면 JVM 스택이 생성됨. 이 때 Frame(stack)이 생성됨
-----------------
| 100번지 | args |
-----------------