본문 바로가기

프로그래밍/JAVA

[JAVA] JVM 구조와 동작 1 (JVM, Class Loader, Execution Engine)

반응형

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 방식으로 기계어 코드를 생성하면서 그 코드를

                           따로 캐싱하여 동일한 코드에서 번역없이 실행 가능

    

반응형