JVM 그리고 코드를 실행하는 과정에 대하여

2024. 2. 3. 21:49백엔드/JAVA

자바 소스를 실행시킬 때 문조건 거치는 곳이 바로 JVM이죠? JVM 내부에서는 과연 무슨 일이 일어날까요?! 오늘은 JVM에 대하여 정리해보겠습니다. 👀

 

# JVM 

  • Java Virtual Machine : 자바 프로그램이 실행되는 가상 머신
  • 운영 체제에 독립적이기 때문에 어느 OS에서든 실행이 가능하다. 
  • 자바 컴파일러에 의해 생성된 바이트 코드(. class파일)를 실행
  • 가비지 컬렉션을 통하여 메모리 관리를 자동화
    • JVM이 관리하는 메모리 영역 : 힙(Heap), 스택(Stack), 메서드 영역(Method area)
    • 가비지 컬렉션 : 사용하지 않는 객체들을 자동으로 식별하여 메모리에서 제거하는 프로세스

 

# 자바 코드 실행 과정 

 

1. 자바 소스 컴파일 

. java 확장자를 가진 소스 코드 파일을 자바 컴파일러(javac)를 통하여 바이트코드(. class)로 변환한다. 

여기서 변환되는 바이트 코드는 OS에 중립적으로, JVM에서 실행이 가능한 형태의 중간 언어이다. 

 

2. 클래스 로딩 

컴파일된 바이트 코드는 JVM에 의해 클래스로 로딩된다. 

클래스 로더는 필요한 클래스를 찾아서 메모리에 로드, 링크하면서 필요한 클래스가 존재하지 않거나 잘못된 클래스가 로드되면 java.lang.VerifyError, ClassNotFoundException 예외를 발생시킨다. 

  • 클래스를 로딩한다 : 런타임 데이터 영역에 클래스를 저장 하는 것 , 클래스가 처음으로 참조될 때 발생
  • 클래스를 링크한다 : 로딩 과정을 포함해 클래스 구조를 완성하는 단계로 검증, 준비, 해석 3단계를 거치는 것 

 

2-1. 클래스 로더는 무엇인가

  • 자바가 동적으로 로드될 수 있도록 해주는 소프트웨어
  • 자바는 클래스를 컴파일타임에 로드하지 않고 런타임에 JVM의 메서드 영역으로 클래스를 로드 
  • 클래스 로더는 Loading, Linking, Initializtation 3가지의 단계를 거친다. 
    • Loading : Bootstrap Class Loader, Extension Class Loader, Application Class Loader
    • Linking : Verify, Prepare, Resolver
    • Initialization : Initialize

(클래스 로더에 대해서 자세하기 적기에는 내용이 길어지기 때문에 추후에 클래스로더에 대하여 작성해 보도록 하겠습니다.)

 

3. 바이트 코드 해석 

로드된 클래스 파일을 바이트 코드로 해석하고 실행할 준비

 

4. 실행 엔진 동작 

실행 엔진을 사용하여 바이트 코드를 실행, 바이트 코드는 인터프리터에 의해 해석되거나 JIT 컴파일러를 통해 기계 코드로 변환 

 

5. 실행 

실행 엔진에 의해 변환된 코드가 실제로 실행, 프로그램 동작