JVM (Java Virtual Machine)
Java Byte Code가 실행 될 수 있는 가상머신을 말한다.
여기서 Java Byte Code란 자바 컴파일러를 통해 *.java -> *.class 파일로 컴파일된 class 파일을 말한다.
운영체제의 종류에 관계 없이 실행 될 수 있다.
크게 구조로는 Class Loader, Execution Engine, Garbage Collector, Runtime Data Area로 구분된다.
Class Loader
자바 컴파일러를 통해 컴파일된 Java Byte Code(=*.class)를 JVM이 운영체제로 부터
할당받은 메모리(=Runtime Data Area)로 적재(로딩, 링크, 초기화) 해준다.
컴파일 단계가 아닌 "실행" 중에 동작함!
- 로딩
동작
1. Java Byte Code를 읽어서 각각의 파일들의 정보(클래스/변수/메소드 이름, 타입 등)를 Method Area 영역에 적재해준다.
2. Class 객체를 Heap 영역에 적재 => Class<T> 형식
Class<Member> memberClass = Member.class;
종류
각 클래스 로더들은 상속관계
Bootstrap Class Loader - jre/lib/rt.jar 파일의 기본 자바 API 클래스들을 로드
△
Extension Class Loader (=Platform Class Loader) - jre/lib/ext 폴더를 뒤져서 모든 확장 코어 클래스들을 로드
△
Application Class Loader (=System Class Loader) - 어플리케이션 레벨의 클래스들을 로드
- 링크
참조들을 연결하는 과정
동작
1. Verfiy : .class 형식 파일이 유효한지 확인
2. Prepare : 메모리 준비과정, 클래스에서 변수에 필요한 메모리를 준비
3. Resolve : Symbolic Memory Referrence를 실제 Reference로 교체
Member member = new Member();
참조 변수 member에 실제 Heap 영역의 객체(new Member())의 메모리 가르킬수 있도록 한다.
- 초기화
Static으로 선언된 속성이나 메소드를 메모리에 올리고 값을 초기화 해준다.
Execution Engine
Java Byte Code(=*.class)를 원시코드(Native Code)로 번역하고 실행해주는 역할을 한다.
종류
- Interpreter : 코드를 한줄씩 원시코드로 번역하여 실행 / 한줄씩은 속도가 빠르지만, 전체로 보면 느림
- JIT(Just-In-Time) : Interpreter을 보완함. 실행 시점에서 Interpreter 방식으로 기계어 코드를 생성하면서 그 코드를
따로 캐싱하여 동일한 코드에서 번역없이 실행 가능
'프로그래밍 > JAVA' 카테고리의 다른 글
[JAVA] Effective Java - 3. private 생성자나 열거 타입으로 싱글턴 보증 (0) | 2022.08.31 |
---|---|
[JAVA] Effective Java - 2. 점층적 생성자, 자바 빈즈, 빌더 패턴 (0) | 2022.08.17 |
[JAVA] Effective Java - 1. 정적 팩터리 메서드 (0) | 2022.08.04 |
[JAVA] JVM 구조와 동작 2 (Runtime Data Area, Garbage Collector) (0) | 2022.04.04 |
[JAVA] Lombok Builder 사용 시 Generic 처리 (0) | 2021.12.06 |