[JVM ] 1. JVM, Class Loader Sub System

개발자 핑구·2023년 7월 28일

JVM

목록 보기
1/1

JVM 이란

JVM은 Java Virtual Machine의 약자로 Java로 작성된 프로그램이 돌아가도록 만들어 주는 프로그램이다.
Java로 작성된 파일은 .class라는 확장자를 가진 파일로 변환이 되고, 이 파일이 JVM위에서 동작한다. 이때 미리 설치된 JVM은 운영체제 별로 동일하게 작동하도록 .class파일에게 작동 환경을 제공한다.

자바 어플리케이션은 WORA(Write Once Run Anywhere)이라고 불리는데, 이 의미는 프로그래머가 자바 코드를 한 시스템에서 개발할 수 있도록 하고, 어떤 조정도 없이 자바가 실행될 수 있는 어떤 시스템에서 실행되도록 한다.

JVM Architecture diagram

Class Loader Subsystem

class loader subsystemd에서는 크게 Loading, Linking, Initialization 이렇게 3가지 일을 한다.

Loading

Class loader가 .class파일을 읽고, 그에 대응되는 이진 데이터를 만들어 Method Area에 저장한다. .class파일에 대해서 JVM은 다음과 같은 정보를 Method Area에 저장한다.

  • 로드된 class와 직접적인 부모 클래스의 풀네임
    (FQCN - 클래스가 속한 패키지 까지 포함된 이름, ex: java.lang.String)
  • .class파일이 class인지 interface인지 enum인지
  • 제어자, 변수, 메소드 정보

After loading the “.class” file, JVM creates an object of type Class to represent this file in the heap memory. Please note that this object is of type Class predefined in java.lang package. These Class object can be used by the programmer for getting class level information like the name of the class, parent name, methods and variable information etc. To get this object reference we can use getClass() method of Object class.

위의 부분은 해석을 못함...

Class Loader

  • Bootstrap class loader: 모든 JVM은 bootstap class loader를 가지고 있어야 한다. 이것은 “JAVA_HOME/jre/lib” 디렉토리에 들어있는 핵심 자바 API 클래스를 로드한다.
    이것은 c,c++같은 native language로 구현되어 있다.
  • Extension class loader: bootstrap class loader의 자식 클래스로, Extension 디렉토리 “JAVA_HOME/jre/lib/ext”(Extension path) 또는 java.ext.dirs 시스템 속성에 의해 구체화된 다른 디렉토리에 들어있는 클래스를 로드한다.
  • System/Application Class Loader: Extension Class Loader의 자식으로 application classpath의 클래스들을 로드하는 역할을 한다. 우리가 선언한 클래스들이 이 Class Loader에 의해서 로드한다.

Linking

Linking에서 verification, preparation, 선택적으로 resolution을 수행한다.

  • Verification: .class 파일을 검사하여 적절하게 포맷됬는지, 그리고 유효한 컴파일러에 의해 생성되었는지를 체크한다. 만약 Verification을 실패하면, 우리는 run-time exception (java.lang.VerifyError)를 얻는다. 이 활동은 ByteCodeVerifier에 의해 행해지고, 한번 완료되면 class 파일은 컴파일 될 준비가 된다.
  • Preparation: JVM은 클래스의 정적 변수를 메모리에 할당하고 기본값으로 intializing한다.
  • Resolution: symbolic reference를 direct reference로 대체한다. 참조된 entity를 할당하기 위해 Method Area내부에서 검색한다. (뭔소린지 잘 모르겠음... 원문: It is the process of replacing symbolic references from the type with direct references. It is done by searching into the method area to locate the referenced entity. )

Initialization

이 단계에서는 모든 정적 변수들을 코드와 static block에 정의된 값으로 initializing한다. 이 과정은 부모클래스에서 부터 자식 클래스로 위에서부터 아래로 실행된다.(원문: This is executed from top to bottom in a class and from parent to child in the class hierarchy)

Delegation-Hierarchy principle(위임 계층 원칙)


사진 출처: https://blog.hexabrain.net/397

JVM은 클래스 로딩 요청을 받을 클래스로더를 선택하기 위해 위임 계층을 따른다.

1.클래스 요청이 들어오면 가장 처음엔 application class loaderd에 들어오고
2. extension class loader에 해당 요청을 위임한다.
3. extension class loader는 다시 bootstap class loader에 위임하고
4. bootstrap class loader는 bootstrap class path(JAVA_HOME/jre/lib)에 해당 클래스가 있으면 클래스를 로드하고
5. 없으면 extension class loader에게 위임한다.
6. extension클래스 로더에선 extension class path(JAVA_HOME_jre/lib/ext)에서 해당 클래스가 있는지 확인하고 있으면 로드하고
7. 없으면 application class loader에게 위임한다.
8. application class loader는 환경변수 classpath에서 클래스를 검색하고
9. 만약 클래스를 찾지 못하면 런타임 예외인 java.lang.ClassNotFountException을 발생시킨다.

Reference

https://tecoble.techcourse.co.kr/post/2021-07-12-jvm-jre-jdk/

https://www.geeksforgeeks.org/jvm-works-jvm-architecture/

https://blog.hexabrain.net/397

0개의 댓글