728x90
자바는 JVM덕분에 OS에 독립적인 특성을 가지고 있다. 그럼 JVM의 어떤 기능 때문에 OS에 독립적으로 실행시킬 수 있는지 자바 컴파일 과정을 알아보자.
자바 컴파일 순서
- 개발자가 Java Source (.java)를 작성한다.
- Java Compiler가 Java Source 파일을 읽어 byte code (.class)로 컴파일한다. 여기서 byte code는 JVM이 읽을 수 있는 코드이다.
- 컴파일된 byte code를 JVM의 Class Loader에게 전달한다.
- Class Loader는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 Runtime Data Area의 Method Area. 즉, JVM의 메모리에 올린다.
- Execution Engine은 JVM 메모리에 올라온 byte code들을 명령어 단위로 하나씩 가져와서 실행한다. 이때, 두 가지 방식의 번역방식이 존재한다.
- Interpreter : byte code를 한줄 한줄 읽으면서 OS가 실행할 수 있도록 기계어로 번역하고, 실행한다. 전체적인 실행 속도가 느리다.
- JIT(Just-In-Time) Compiler : static compile 방식으로, 지속적으로 Interpreter 하다가 자주 사용하는 코드의 정보를 실행하기 전에 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하여 캐시에 담아두었다가, 이후에는 바이너리 코드로 직접 실행하는 방식이다.
- 즉, JVM은 내부적으로 어떤 메서드가 얼마나 자주 수행되는지를 확인하고, 핫스팟이라고 판단되면 컴파일을 수행해놓는 것이다.
- 하지만, JIT 컴파일러는 byte code를 native 코드로 전체를 미리 바꿔놓기 때문에 실행은 빠르지만, 변환시에 비용이 발생한다는 단점이 있어 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, Interpreter 방식을 사용하다가 자주 사용되는 코드만 캐싱한다.
인용
https://velog.io/@mooh2jj/JIT-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC%EB%9E%80
https://kingofbackend.tistory.com/122
728x90
'Language > Java' 카테고리의 다른 글
Math클래스 API (0) | 2023.09.13 |
---|---|
JVM의 CLASSPATH 옵션 (0) | 2023.09.13 |
오버플로우 (overflow) (0) | 2023.09.07 |
각 타입별 값의 범위 (0) | 2023.09.07 |
논리 연산자 &&과 &, ||과 |의 차이 (0) | 2023.09.07 |