컴파일
: 고급언어(사람이 이해하기 쉬운 언어)로 개발한 프로그램을 기계어(컴퓨터가 이해하기 쉬운 언어)로 바꿔주는 것이다.한 문장씩 읽고
바로 기계어로 바꿔준다.전체 소스코드를 모두
기계어 파일로 바꿔주고 그후에 변환된 코드를 실행한다.
자바 소스코드(.java)
를 작성한다.자바 소스파일(.java)
을 컴파일하여 자바 바이트 코드(.class)
를 만든다.자바 바이트 코드(.class)
를 JVM(Java Virtual Machine)의 class loader
에게 전달한다.class loader
는 동적 로딩(Dynamic Loading)
을 통해 필요한 클래스들을 로딩/링크 하여 Runtime Data Area(JVM의 메모리)
에 올린다.
class loader
의 세부 동작
- 로드 :
자바 바이트 코드(.class)
를 가져와서Runtime Data Area(JVM의 메모리)
에 로드한다.- 검증 :
자바 언어 명세(Java Language Specification)
및JVM 명세
에 명시된 대로 구성되어 있는지 검증한다.- 준비 : 클래스가 필요한 메모리를 할당한다. (필드, 메소드, 인터페이스 등)
- 분석 : 클래스의 constant pool 내의 모든 symbolic reference를 direct reference로 변경한다.
constant pool
: Java Class File의 구성 항목 중 하나인 Constant pool은 리터럴 상수 값을 저장하는 곳이다.- 초기화 : 클래스 변수들을 적절한 값으로 초기화한다. (static 변수)
Execution Engine
은 Runtime Data Area(JVM의 메모리)
에 올라온 자바 바이트 코드(.class)
를 명령어 단위로 하나씩 가져와서 실행한다.
Execution Engine
에는 Interpreter와 Just-In-Time Compiler가 있다
- Interpreter :
자바 바이트 코드(.class)
를 한 줄씩 읽는다.
- 실행이 느린 단점이 있다.
- JIT(Just-In-Time) Compiler : Interpreter의 느린 단점을 보완하기 위해 나온 컴파일러이다.
- interpreter 방식으로 실행하다가 적절한 시점에
자바 바이트 코드(.class)
전체를 컴파일하고 더이상 interpreting 하지 않고 해당 코드를 직접 실행한다.- JIT Compiler에 의해 해석된 코드는 캐시에 보관되므로 한 번 컴파일 된 후 빠르게 수행되는 장점이 있다.
- interpreting 방식보다 훨씬 오래 걸리므로 한번만 실행되는 코드는 interpreting이 유리하다.
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
자바코드(.java)
파일을 JVM(Java Virtual Machine)이 이해할 수 있는 자바 바이트 코드로 변환해준다..class
이며 JVM이 설치되어 있으면 어느 운영체제에서도 실행이 가능하다.