
JVM의 구성요소
▼JVM은 아래와 같이 구성되어져 있다.▼
1. 클래스 로더(Class Loader)
JVM의 Class Loader는 javac에 의해 변환된 바이트코드 파일인 *.class 파일을 Runtime Data Areas에 로딩하여 프로그램을 구동한다. Class Loader의 로딩은 런타임에 일어나는데, 클래스에 처음 접근될 때 일어난다. 이를 통해 Lazy Loading Singleton 이 구현되기도 한다. (+ Class Loading 시간엔 Thread -safe 하다.)
2. 실행 엔진(Execution Engine)
Class Loader가 Runtime Data Areas에 불러온 바이트 코드를 실행한다. 바이트 코드를 기계어로 변경해 명령어 단위로 실행하는데, 1바이트의 OpCode와 피연산자로 구성이 된다.
- 인터프리터(Interpreter)
-컴파일러(Just-in-Time)
3. 가비지 콜렉터(Garbage collector)
Heap 영역에 참조되지 않는 오브젝트를 제거하는 역할을 한다. 자바 이전에는 프로그래머가 모든 프로그램의 메모리를 관리했다. 자바에서는 JVM이 가비지 컬렉션이라는 프로세스를 통해 프로그램 메모리를 관리한다. 가비지 컬렉션은 자바 프로그램에서 사용되지 않는 메모리를 지속적으로 찾아내서 제거하는 역할을 한다.
4. 런타임 데이터 영역 (Runtime Data Areas)
OS로부터 할당받은 JVM의 메모리 영역이다. 자바 어플리케이션을 실행하는데 필요한 데이터를 담는다.
Runtime Data Areas는 아래와 같이 5개의 영역으로 나뉘어 진다.
Method와 Heap 영역은 모든 Tread가 공유를 하고
Stack, PC Register, Native Method 영역은 각 Tread 마다 존재하는 영역이다.
(1)Method area
JVM이 시작될 때 생성되고 JVM이 읽은 각각의 클래스와 인터페이스에 대한 런타임 상수 풀, 필드 및 메서드 코드, 정적 변수, 메서드의 바이트 코드 등을 보관한다. Non-Heap 영역으로 Permanent 영역에 저장이된다. JVM 옵션 중 PermSize(Permanent Generation의 크기) 를 지정할 때 고려해야 할 요소이다.
1-1 Type Information
- Interface 여부
- 패키지 명을 포함한 Type 이름
- Type의 접근 제어자
- 연관된 Interface 리스트
1-2 Runtime Constant Pool
- Type, Field, Method로의 모든 레퍼런스를 저장
- JVM은 Runtime Contant Pool을 통해 메모리 상 주소를 찾아 참조한다.
1-3 Field Information
- Field의 타입
- Field의 접근 제어자
1-4 Method Information
- Constructor를 포함한 모든 Method의 메타데이터를 저장
- Method의 이름, 파라미터 수와 타입, 리턴 타입, 접근 제어자, 바이트코드, 지역 변수 section의 크기 등을 저장
1-5 Class Variable
- static 키워드로 선언된 변수를 저장
- 기본형이 아닌 static 변수의 실제 인스턴스는 Heap 메모리에 저장
(2)Heap Area
new 연산자로 생성된 객체를 저장하는 공간이다. 참조하는 변수나 필드가 존재하지 않으면 GC(Garbage Collector)의 대상이 된다.
(3)Stack Area
Tread마다 별개의 Frame으로 저장하며, 저장되는 요소는 아래와 같다.
3-1 Local Variable Area
- 지역변수, 매개변수, 메소드를 호출한 주소 등 Method 수행 중 발생하는 임시데이터를 저장한다.
- 4바이트 단위로 저장되며, int, float 등 4바이트 기본형은 1개의 셀, double 등 8바이트의 기본형은 2개의 셀을 차지한다. bool은 일반적으로 1개의 셀을 차지한다.
3-2 Operand Stack
- Method의 workspace 이다. 어떤 명령을 어떤 피연산자로 수행할 지 나타낸다.
3-3 Frame Data
- Constant Pool Resolution, Method Return, Exception Dispatch 등을 포함한다.
- 참조된 Exception의 테이블도 가지고 있다.Exception이 발생하면 JVM은 이 테블을 참고하여 어떻게 Exception을 처리할 지 정한다.
(4)PC Register
Tread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로, 스레드마다 하나씩 존재한다.
Tread가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 Tread가 현재 실행하고 있는 부분의 주소를 갖는다. OS는 PC(Program Counter) Register를 참고하여 CPU 스케줄링 시 해당 Tread가 다음에 어떤 명령어를 수행해야 하는지 알 수 있다.
(5)Native Method Stack
자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다. Java가 아닌 다른 언어로 작성된 코드를 위한 공간이다. Java Native Interface를 통해 바이트 코드로 전환하여 저장하게 된다. 일반 프로그램처럼 커널이 스택을 잡아 독자적으로 프로그램을 실행시키는 영역이다.
(실행 순서)
1. 프로그램이 실행되면 JVM은 OS로 부터 이 프로그램을 실행하는데 필요한 메모리를 할당받음.
JVM은 이 메모리를 여러 영역으로 나누어 사용한다.
2. Java Compiler(javac)가 *.java 파일을 컴파일하여 *.class 인 자바 바이트코드로 변환시킨다.
3. 컴파일된 *.class파일들을 Class Loader를 통해 JVM 메모리 위에 로딩을 한다.
4. 로딩된 *.class 파일들은 Excution Engine을 통해 기계어로 해석된다.
5. 해석된 바이트코드들은 메모리 영역에 배치되어 실질적인 수행을 하게 된다. 실행과정 속에서 JVM은 필요에 따라 스레드 동기화나 가비지컬렉터와 같은 메모리 관리 작업을 수행한다.
'DailyStudy > Java' 카테고리의 다른 글
Scouter JDK 17 이용 시 server 실행 문제 (0) | 2024.05.14 |
---|---|
Garbage Collection(GC) (0) | 2023.10.22 |
JVM(JavaVirtualMachine) 파헤치기 (1) (0) | 2022.09.22 |
객체지향 프로그래밍과 절차적프로그래밍에 대해 알아보자🕵 (0) | 2022.08.31 |