케네스로그

[Java] JVM 아키텍처(1) - JVM구조, 클래스로더 ClassLoader 본문

Dev/Java

[Java] JVM 아키텍처(1) - JVM구조, 클래스로더 ClassLoader

kenasdev 2021. 10. 9. 15:57
반응형

Java Virtual Machine ⚙️

Java의 슬로건처럼, 하나의 코드로 어떤 기기에서든 동작할 수 있게 하는 원천은 JVM에 있다. JVM은 Java Virtual Machine의 약자로, 자바로 작성된 코드를 실행시켜주는 프로그램이다.

Java언어로 작성된 소스코드는 .java형식의 파일로 저장된다. 이 .java파일은 자바 컴파일러에 의해 .class형식의 자바 바이트코드 파일로 변환된다. .class 파일의 바이트코드는 JVM에 의해 각 OS가 실행할 수 있는 기계어 형식으로 전달된다.

 

 

JVM 아키텍처

JVM 아키텍처

JVM은 크게 3개의 컴포넌트로 나눌 수 있다.

  • Class Loader
  • Runtime Data Area
  • Execution Engine

 

 

 


1. 클래스로더(Class Loader)

JVM의 구성요소 중 ClassLoader는 3가지의 타입이 존재하며, 3단계로 역할을 수행한다.

 

 

1) Loading Phase

부트스트랩 클래스로더(Bootstrap Class Loader)

RT.jar(런타임 jar)로부터 .class파일을 메모리에 로드하는 역할을 담당한다.

위의 간단한 Java 프로그램을 만들었다. 위의 명령 중 println()이라는 메소드를 실행하기 위해서 해당 메소드는 분명 어딘가 정의되어있어야만 한다. 하지만, 우리는 저런 메소드를 정의한적이 없고, 다른 라이브러리(패키지)를 import한 적도 없다. 분명, System이라는 패키지가 import되어야만 실행이 가능한 문장이다.

 

System패키지는 RT.jar에서 이용할 수 있는 패키지 중 하나이다. 이것은 자바 설치파일의 jre/lib에 위치한다. Bootstrap Class Loader는 jre/lib에 위치한 기본 패키지들을 런타임 메모리 영역(Runtime Memory Area)로 로드한다. 다시말해, 자바 프로그램 실행에 필요한 기본 패키지들을 로드하는 역할을 수행한다.

 

💡JAR이란?
JAR은 Java ARchive의 축약형으로, 서로 관련된 클래스 파일과 메타데이터들이 집약된 패키지 파일의 포맷이다. 앞서 언급한 RT.jar은 런타임에 필요한 클래스와 데이터들이 모여있는 압축 파일이라고 할 수 있다. 자세한 정보는 이곳에 확인 가능하다.

 

 

익스텐션 클래스로더(Extension Class Loader)

Extension ClassLoader는 추가적인 클래스 파일(/jer/lib/ext에 위치)을 로드한다.
예를 들어, 오라클DB를 이용한다면 OJDBC패키지가 필요하다. 해당 패키지는 익스텐션 클래스로더에 의해 메모리에 로드된다.

 

 

 

어플리케이션 클래스로더(Application Class Loader)

자바 파일은 컴파일러를 통해 .class파일로 컴파일된 후 JVM의 어플리케이션 클래스로더에 의해 메모리로 로드된다. 즉, 어플리케이션 클래스로더는 실질적으로 .class파일을 메모리에 로드하는 역할을 한다.

 

2) Linking Phase

- Verify: 바이트코드 클래스파일이 JVM standard를 따르는지 확인한다.

- Prepare: 정적 변수와 초기값(default value)들이 메모리 공간에 할당된다.

- Resolve: Symbolic Reference들이 실제 참조들로 대체된다.

 

 

3) Initialization Phase

모든 정적 변수가 실제 값들로 할당되며, 초기화 작업들이 이루어진다.

 

 

 

 

 

 

 

 

반응형