[Java] 자바 컴파일 과정 | class loader, jvm, compiler, interpreter

dyomi·2024년 7월 4일

JVM이란,

자바 프로그램이 운영체제로부터 독립적일 수 있도록 도와주는 가상 머신으로, 컴파일된 바이트 코드를 OS가 인식할 수 있는 기계어로 변환해주는 역할을 한다.

1. 자바 코드 작성

개발자가 자바 코드르 작성하면 .java 파일이 만들어 진다.

2. 바이트 코드 변환

자바 컴파일러가 이 자바 코드를 컴파일하면(명령어: javac Application.java), 바이트 코드로 된 클래스 파일 .class 이 생성된다.

이 클래스 파일은 자바 가상머신인 JVM이 읽을 수 있는 코드이고, 아직 컴퓨터가 읽일 수 없는 파일이다.

3. 클래스 로더와 실행 엔진

JVM은 클래스 로더와 실행엔진, 런타임 데이터 영역으로 구성 있다.

클래스 로더는 JVM내로 클래스 파일을 동적으로 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다.

이 클래스 로더로 컴파일된 클래스 파일을 넘겨주면, 런타임시 동적으로 클래스를 로드하고 런타임 데이터 영역의 메서드 영역에 바이트 코드를 배치시킨다.

그 후 실행엔진이 이 바이트 코드를 명령어 단위로 하나씩 가져와서 실행하게 되는데, 이때 사용되는 방식이 인터프리터 방식과 JIT 컴파일러 방식으로 나뉜다.

인터프리터 방식은 바이트 코드를 한 줄씩 읽고,
JIT 컴파일러 방식은 바이트 코드를 한번에 컴파일하고 캐싱하는 방식이다.

컴파일 과정은 JIT 컴파일러 방식이 오래 걸리므로 한번만 실행되는 코드라면 인터프리팅이 유리하고, 특정 메서드가 수행되는 횟수가 일정 정도를 넘을때 JIT 컴파일러 방식을 사용하는 것이 유리하다.


추가로 런타임 데이터 영역 (JVM 메모리 구조) 부분은 다음 포스팅 참고
[Java] JVM 메모리 영역 | Method Area, Heap, Stack, PC register, Native Method Stack



🌟 추기 질문

📍 그렇다면 c, c++ 등 다른 언어들과는 과정이 어떻게 다를까?

JVM의 가장 큰 장점은 운영 체제에 독립적이라는 것이다.
컴파일을 한 번만 하면 JVM이 설치된 운영 체제에서는 어디든 실행이 될 수 있다는 점이 가장 큰 장점이다.

c언어 같은 경우, 기계어로 컴파일 한 뒤, 바로 실행이 가능하다.
하지만 이 컴파일된 언어는 운영체제에 종속적이다.
대신 인터프리터와 같은 중간 과정이 없기 때문에 간편하고, 속도가 빠르다는 장점이 있다.


📍 그렇다면 JVM을 사용하면 속도 측면에서 많이 느려질까?

생각보다 JVM으로 인한 속도가 느려서 생길 수 있는 문제의 도메인은 굉장히 작다.

레이턴시가 정말로 중요한 게임이라던지 아니면 수만 건을 1초에 처리해야 되는 트레이딩 애플리케이션 등 이런 곳에서는 이 속도가 영향이 될 수 있지만, 결과적으로 자바에서도 계속 최적화를 하게 되면서 c나 c++과 비교 했을 때 20마이크로세컨드 정도밖에 차이나지 않는다.

그렇기 때문에 JVM이 주는 장점이 단점보다 크다고 볼 수 있다.



참고자료
[Java] Java의 컴파일 과정을 최대한 쉽게 이해해보자

profile
기록하는 습관

0개의 댓글