Program Program J V M <- O S O S H / W H / W <일반 프로그램> <Java 프로그램>
- 텍스트 파일인 자바 소스코드 작성
- 자바 컴파일러가 자바 소스파일을 컴파일
(이때 나오는 파일은 자바 바이트 코드(.class)파일로 아직 컴퓨터가 읽을 수 없는 자바 가상 머신이 이해할 수 있는 코드)
- 컴파일된 바이트 코드를 JVM의 클래스로더에게 전달
- 클래스 로더는 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 JVM의 메모리(Runtime Data area)에 올림
- 클래스 로더 세부 동작
- 실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 기계어로 변경 (두가지 방식)
- 기계어로 번역됨
- main() 메소드 찾아서 실행
- 실행문 : 변수 선언, 값 저장, 메소드 호출에 해당하는 코드
컴파일된 .class 파일을 동적으로 JVM 메모리에 로딩하는 역할
JVM이 동작하다가 클래스 파일을 참조하는 순간 동적으로 읽어서 메모리에 로드되면서 JVM에 링크 됨
컴파일된 클래스 파일은 Loading -> Linking -> Initializing 단계를 거쳐 JVM에서 사용할 수 있게 됨
클래스 로더가 .class 파일을 읽고 데이터를 Method Area
영역에 저장
메소드 영역에 저장하는 데이터들
- FQCN(Fully Qualified Class Name) : package를 포함한 Class이름
→ java.lang.String
- 클래스 | 인터페이스 | 이넘
- 메소드와 변수
클래스 로더 세부 동작
로드
: 클래스 파일을 가져와서 JVM의 메모리에 로드
: 클래스 파일을 읽고 그에 따라 적절한 바이너리 데이터를 만들고 메소드 영역에 저장하는 동작 수행
: 이 과정에서 클래스 파일이 JVM 스펙에 맞는지 확인하고 Java Version도 확인
검증
: 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사
준비
: 클래스가 필요로 하는 메모리를 할당 (static 변수와 기본값, 필드, 메서드, 인터페이스 등등)
분석
: 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경
초기화
: 클래스 변수들을 적절한 값으로 초기화 (static 필드)
: 링크(link)의 준비(prepare) 단계에서 확보한 메모리 영역에 클래스의 static 값들을 할당
: SuperClass 초기화와 해당 클래스의 초기화 진행
Method Area (Static 영역)
JVM 스택 영역
Heap 영역
Garbage Collector
인터프리터
JIT 컴파일러(Just-In-Time Compiler)