JVM의 구조
1.Class Loader
- 자바에서 소스를 작성하면 .java파일이 생성된다.
- .java파일을 자바컴파일러(javac)가 컴파일하여 .class파일(byteCode)가 생성된다.
- 생성된 클래스 파일들을 엮어서 JVM이 OS로부터 할당받은 메모리 영역인 Runtime Data Areas로 옮긴다.
2. Execution Engine (실행 엔진)
- 메모리영역에 적재된 클래스(byteCode)들을 기계어로 해석하여 명령어 단위로 실행한다.
- 인터프리터
인터프리터(Interpreter)란 바이트 코드를 한줄씩 실행하는 방식이다. - JIT(Just-In-Time) 컴파일러
JIT 컴파일러는 반복되는 코드를 발견하여 바이트 코드 전체를 네이티브 코드로 컴파일하여 한번에 실행시키는 것으로 성능을 높이기 위한 방식이다.
3. Garbage Collector (GC)
- 가비지 컬렉터는 Heap 메모리 영역에 생성된 객체들 중 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.
- 이는 자동으로 이루어지기 때문에 더 쉬운 프로그래밍이 가능하다.
4. Runtime Data Area
- JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다.
- 런타임 데이터 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Nateve Method Stack으로 나눌 수 있다.
Runtime Data Area 구조
1. Method area (메서드 영역, Class area, Static Area)
- JVM이 시작될 때 생성되는 공간한다.
- 모든 스레드가 공유한다.
- 프로그램이 종료될 때까지 저장(정적, static)
- 바이트 코드(.class)를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간
- Field Info : 멤버 변수 이름, 데이터 타입, 접근 제어자 정보
- Method Info: 메서드 이름, return타입, 함수 매개변수, 접근제어자 정보
- Type Info : Class, Interface 여부 저장, Type속성, 이름, Super Class이름
2. Heap area(힙 영역)
- 모든 스레드가 공유한다.
- new 연산자로 생성된 객체와 배열이 생성되는 영역이다.
- 메서드 영역에 로드된 클래스만 생성 가능하다.
- GC(Garbage Collection)의 대상이 된다.
- 힙 영역에 생성된 객체는 Reference(참조) Type으로 JVM스택영역의 변수나 다른 객체의 필드에서 참조된다.
3. Stack area (스택 영역)
- 임시적으로 사용되는 변수나 정보들이 저장되는 영역이다.
- Stack은 LIFO(Last-In-First-Out) 구조로 push/pop을 사용하여 동작한다.
- Person p = new Person(); 라는 코드를 작성했다면 Person p는 스택영역에 생성되고 new 연산자로 생성된 Person클래스의 인스턴스는 힙영역에 생성된다.
- 스택영역에 생성된 p는 힙 영역의 인스턴스 주소값을 가지고 있다. (참조)
- 기본타입 변수는 스택 영역에 직접 값을 가진다.
4. PC Register (Program Counter 기억장치)
- 스레드가 시작될 때 생성되는 영역이다.
- 현재 수행 중인 JVM 명령어 주소를 저장하는 공간이다.
- JVM에서의 작업내용을 CPU에게 연산으로 제공할 때 중간에 잠시 버퍼 공간으로 존재한다.
- 이를 이용해 스레드를 돌아가며 수행할 수 있게 한다.
5. Native method stack
- 자바 외 언어(C, C++ 등)로 작성된 네이티브 코드를 위한 메모리 영역이다. (JNI - Java Native Interface)
- 기계어로 작성된 프로그램을 실행시키는 영역이다.
Reference
https://jeong-pro.tistory.com/148
https://catsbi.oopy.io/df0df290-9188-45c1-b056-b8fe032d88ca
'Java' 카테고리의 다른 글
[Java/자바] Java 메인 메서드의 의미에 대하여 (1) | 2024.02.07 |
---|---|
[Java/자바] JDK, JRE, JVM에 대하여 (0) | 2023.09.13 |
[Java/자바] 클래스, 객체, 인스턴스에 대하여 (0) | 2023.09.12 |
[Java/자바] equals, hashCode 메서드에 대하여 (0) | 2023.09.07 |
[Java/자바] toString() 메서드에 대하여 (0) | 2023.09.05 |