JVM 구조
Class Loader(클래스 로더)
Java는 클래스를 동적으로 읽어온다. 즉 프로그램이 실행 중인 런타임으로 들어가야만 모든 코드가 JVM과 연결이 되는 동적으로 class를 로딩해주는 역할이 바로 Class Loader(클래스 로더)이다. Java에서 소스를 작성하면 .java파일이 생성이 되고 .java파일을 컴파일 하면 .class파일이 생성된다 이 .class파일을 묶어서 JVM에게 보내주는 역할이 Class Loader(클래스 로더)이다.
Execution Engine(실행엔진)
앞에서 .class파일은 바이트 코드라고 하는데 이 파일들은 각각 영역에 맞게 메모리 영역에 배치가 된다. 배치된 바이트 코드들은 Execution Engine에 제공되고 이때 로드된 바이트 코드를 실행하는 것이 Execution Engine(실행 엔진)이다. Execution Engine은 바이트 코드를 명령어 단위로 읽어서 실행한다.
Garbage Collector(가비지 콜렉터)
JVM은 Garbage Collector를 이용해 사용하지 않는 메모리를 자동으로 회수해준다. 따라서 개발자들이 수동으로 사용하지않는 메모리를 관리할 필요가 없기 때문에 더욱 쉽게 프로그래밍을 할 수 있다. Heap 메모리 영역에 생성된 객체들 중에 참조되지 않은 객체들을 탐색 후 제거하지만 언제 정확히 제거하는지는 알 수가 없다.
Runtime Data Area(런타임 데이터 영역)
Runtime Data Area(런타임 데이터 영역)이 바로 JVM의 메모리 구조이고 Java에서 사용되는 데이터들이 적재되는 영역이다.
JVM 동작구조
1. Java로 만든 프로그램을 실행하면 JVM은 첫 번째로 OS로부터 메모리를 할당한다.
2. Java 컴파일러가 소스코드를 Java 바이트 코드(.class)로 컴파일 한다.
3. Class Loader(클래스 로더)를 통해 JVM Runtime Data Area로 로딩
4. 로딩된 .class는 Execution Engine을 통해 해석
5. 해석된 .class파일들은 Runtime Data Area의 각각 영역에 맞게 배치되고 수행하며 스레드 동기화가 이루어짐
6. 앞에 과정에서 GC(Garbage Collector)은 Execution Engine에 의해 작동한다.
JVM 메모리 구조
Method Area
- 클래스 멤버변수의 이름, 데이터 타입, 접근 제어자 정보
- static 변수, final class등이 생성되는 영역
Heap Area
- new 키워드로 생성된 객체와 배열이 생성되는 영역
- 주기적으로 Garbage Collector가 제거하는 영역
Stack Area
- 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역
PC register
- 현재 Thread가 실행되는 주소와 명령을 저장하고 있는 영역
Native Method Stack
- Java 프로그래밍 언어 이외의 언어로 작성된 메서드를 지원하기 위한 Stack(C/C++,등등)
- Java로 만든 메서드가 아닌 메서드를 호출할 시 JVM Stack은 동작하지 않고 Native Method Stack이 할당된다.
Thread가 다같이 사용하는 영역
- Method Area
- Heap Area
Thread별로 사용하는 영역
- Statck Area
- PC register
- Native Method Stack
'Language > Java' 카테고리의 다른 글
[Java] 자료형과 데이터 (0) | 2023.08.20 |
---|---|
[Java] java printf와 println 차이점 (0) | 2023.08.20 |
[Java] JRE와 JDK에 대해 알아보자 (0) | 2023.08.17 |
[Java] 자바 가상 머신 JVM(Java Virtual Machine),JIT (0) | 2023.08.17 |
[Java] Java란? (0) | 2023.08.16 |