loading
,linking
,initializing
3가지 역할로 나눠 class파일을 로드하는 역할을 합니다.
ClassLoader가 필요한 .class 파일들을 찾아 탑재합니다.
기본으로 제공받는 파일인지 또는 개발자가 정의한 파일인지 기준에 의해 Class Loader의 수준도 3가지로 나뉩니다.
class loader | desc |
---|---|
Boostrap ClassLoader . | 가장 상위의 ClassLoader로 JVM을 구동시키기 위한 필수 라이브러리입니다. 따라서 OS에 맞게 native code로 개발되어 있습니다. |
Extensions ClassLoader . | Bootstrap 다음으로 우선순위를 가지는 ClassLoader입니다. localedata, zipfs 등 다른 표준핵심 Java Class의 라이브러리들을 JVM에 탑재하는 역할입니다. |
Application ClassLoader . | Classpath에 있는 class들을 탑재합니다. 개발자들이 작성한 파일들을 JVM에 탑재합니다. |
탑재된 class파일들을 검증하고, 사용할 수 있게 준비하는 과정입니다.
Verification
, Preparation
, Resolution
3단계로 이뤄져있습니다.
step | desc |
---|---|
verification . | class파일이 유효한지 확인하는 과정입니다. JVM 조건대로 구현되지 않았을 경우 VerifyError발생합니다. |
preparation | class 및 interface에 필요한 static field 메모리를 할당하고, 기본값으로 초기화합니다. |
resolution(무슨말이지....) . | Symbolic Reference 값을 JVM 의 메모리 구성 요소인 Method Area 의 런타임 환경 풀을 통하여 Direct Reference 라는 메모리 주소 값으로 바꾸어줍니다. 해당 단계의 영향을 받는 JVM Instruction 요소는 new 및 instanceof 가 있습니다. |
class파일의 코드를 읽습니다. class와 interface값들을 지정한 값들로 초기화 및 초기화 메소드를 실행시킵니다.
JVM은 multi-threading으로 동작하기 때문에 초기화 단계에서도 동시성을 고려해야 합니다.
OS로부터 할당받은 JVM 메모리 영역으로 application을 실행할 때 사용되는 데이터들을 적재
class 또는 interface에 대한 metadata가 저장됩니다.
data | desc |
---|---|
type information . . . | 1. interface 여부 2. pacakge명을 포함한 type 이름 3. type의 접근 제어자 4. 연관된 interface 리스트 |
runtime constant pool . | 1. type, field, method의 모든 reference 저장 2. JVM은 Runtime constant pool을 통해 실제 메모리 상 주소를 찾아 참조 |
field information . | 1. field type 2. field 접근 제어자 |
method information . | 1. constructor를 포함한 모든 method의 metadata 저장 2. method 이름, parameter수와 타입, 리턴 타입, 접근 제어자, 바이트 코드, 지역 변수 등 저장 |
class variable . | 1. static 키워드로 선언된 변수 저장 2. 기본형이 아닌 static 변수의 실제 인스턴스는 heap 메모리에 저장 |
런타임시 동적으로 할당(new 명령어)된 instance와 배열 등의 참조형 변수정보가 저장
되는 공간
Thread마다 별개
로 저장하고, method 호출할 때마다 frame을 추가하고, method가 종료되면 제거
data | desc |
---|---|
local variable . . | 1. 지역 변수, 매개 변수, 메소드를 호출한 주소 등 method 수행 중 발생한 임시 데이터 저장 2. primitive type은 stack 영역에서 직접 값을 가진다. 3. reference type은 heap영역이나 method영역의 주소를 가진다. |
operand stack | ... |
frame data | ... |
thread가 현재 실행하고 있는 부분의 주소를 저장
자바 외 언어로 작성된 native code를 위한 메모리 영역
Execution Engine은 Runtime Data Area에 적재된 bytecode를 실행(binary code로 변경)합니다.
기계어로 변경해 명령어 단위로 실행하는데, interprter
, JIT
2가지 방식으로 실행합니다.
명령을 순차적으로 읽으며 실행합니다. 파일 이름을 인자로 받으며, main함수를 포함해야 합니다.
interpreter의 느린 단점을 개선한 compiler입니다. 유사한 bytecode를 캐싱해둬서 시간을 단축시켰습니다.