자바 컴파일 과정 및 JVM

이승주·2024년 3월 21일
0

자바

목록 보기
1/2

📌 자바와 JVM

Java는 JVM이라는 가상 머신을 통해 OS 종류와는 관계 없이 구동 환경만 적합하면 코드를 실행할 수 있다. 따라서 Java의 특징적인 컴파일 환경, JVM의 구조 등을 정리하려 한다.


📌 JVM을 사용하지 않는다면?

C언어를 예시로 한번 살펴 보려고한다.
C는 컴파일 시 바로 Binary code인 기계어로 변환이된다.
이때 특정 OS, CPU 구조를 사용하는 컴파일러에 의해서 컴파일 됐으며,
다른 OS, CPU 구조를 사용하는 환경에서는 이 기계어를 읽을 수 없게 된다.


📌 자바의 컴파일

자바 컴파일 과정은 소스 파일을 JVM이 읽을 수 있는 바이트 코드로 변경하는 과정이다.

  1. 개발자가 소스코드 .java 파일을 작성한다.
  2. Java compiler인 javac이 .java 파일(소스 코드) -> .class 파일(바이트 코드)로 변환해준다.

📌 자바의 런타임

자바 런타임 과정은 JVM에서 컴파일된 바이트 코드가 실제로 실행되는 단계이다. 아래는 JVM의 구조다.

  1. 런타임시, 컴파일된 바이트 코드를 JVM의 클래스로더(Class Loader)에게 전달한다.
  1. 클래스 로더는 동적 로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data Area), 즉 JVM의 메모리에 올린다.

클래스 로더 세부 동작

로드: 클래스 파일을 가져와서 JVM의 메모리에 로드한다.
Linking을 통해 로드된 .class 파일들을 검증, 준비, 해석과정을 거친다.

  • 검증: 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사한다.
  • 준비: 클래스가 필요로 하는 메모리를 할당한다. (필드, 메서드, 인터페이스 등)
  • 분석: 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경한다.
  • 초기화: 클래스 변수들을 적절한 값으로 초기화한다. (static 필드)
  1. 실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행한다.

이 때 실행 엔진은 두 가지 방식을 함께 사용해 실행한다. 인터프리터 컴파일 방식은 코드를 한줄씩 읽어 해석하기 때문에 속도가 느리다. JIT는 느린 인터프리터 방식을 보완해준다.

인터프리트: 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행한다.
JIT 컴파일러: 프로그램 실행 중 자주 사용되는 바이트코드 부분을 실시간으로 기계어로 컴파일하여 실행 속도를 향상시킴

Byte code: "가상 머신이 읽을 수 있는 이진 코드"
Binary code: "기계가 읽을 수 있는 이진 코드"


📌 JVM 내 RUNTIME DATA AREA

JVM이 운영체제로부터 할당받은 메모리영역이다.

Method Area : 클래스에 대한 정보가 올라오는 영역. 모든 쓰레드가 공유
Heap : new 키워드를 통해 생성된 인스턴스가 생성되는 영역. 모든 쓰레드가 공유
Stack : 지역변수, 매개변수, 리턴값 등 임시적으로 사용되는 값들이 저장되는 영역
PC Register : 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하는 영역
Native Method Stack : Native 언어로 작성된 코드를 실행하기 위한 영역


참고자료

당근케잌- 왜 JVM이 필요한가?

조민서-자바 컴파일 과정 & JVM 내부 구조

doozi- JVM이란? 개념 및 구조

impala- Runtime Data Area

profile
반복되는 실수를 기록을 통해 줄여가보자!

1개의 댓글

comment-user-thumbnail
2024년 6월 13일

JVM에 대해 공부하는데 큰 도움 되었습니다. 감사합니다.

답글 달기

관련 채용 정보