티스토리 뷰

반응형

목차

    클래스 로더(class loader)

    클래스를 로딩하는 기능을 담당한다. 

    이미지 출처 : https://velog.io/@jifrozen/JVM-%EA%B5%AC%EC%84%B1%EC%9A%94%EC%86%8C-1-%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%A1%9C%EB%8D%94

     
    클래스 로더는 java 파일을 class 파일로 java 컴파일러가 컴파일하고 나면, 이를 수행할 수 있게 번역하고 가공해 준다.다시 말해서 .class 파일을 읽고 → 올바른 명세인지 확인 → 메모리 할당 → 필요한 변수들을 초기화 과정을 진행하여 JVM에서 클래스들을 실행하기 위한 작업을 진행하고 Java 애플리케이션이 실행되는 역할을 한다.
     

    클래스 로더의 역할

    1. 클래스 로딩 : 클래스 파일을 로드하여 메서드 영역에 클래스의 정보를 저장한다. 이 때, 메서드 영역에 저장되는 클래스의 정보는 클래스의 바이트 코드, 메서드, 변수, 메타데이터등이 포함된다.
    2. 중복 로딩 방지 : 클래스 로더는 중복 로딩을 방지하기 위해 이미 로딩된 클래스는 다시 로드하지 않는다. 이를 통해, 메모리를 효율적으로 관리한다.
    3. 클래스 초기화 : 클래스를 초기화하여 클래스 변수의 초기화 및 정적 블록 실행을 관리해 준다.
    4. 클래스 언로딩 : 일부 JVM은 더 이상 필요하지 않은 클래스를 메모리에서 해제하는 기능을 제공한다.

    클래스 로더의 진행 단계

    Loading -> Linking(Verifying -> Preparing -> Resolving) -> Initializing 단계로 클래스 로딩을 진행하며, 각 단계의 구체적인 역할은 다음과 같다.
     

    1. Loading : javac를 통해 만들어진 .class 파일을 최초로 읽는 역할
      1. static main 메서드부터 읽기 시작한다.
    2. Linking : Loading 단계에서 읽어 들인 바이트 코드에 대해 연관관계(Reference)가 있는 코드끼리 다시 연결해 준다.
      1. 연관관계가 있는 코드를 연결이란? 클래스 파일에서 사용되는 다른 클래스나 메서드, 필드 등의 실제 위치를 연결해 준다.
    3. Initializing
      1. 클래스 변수를 초기화한다. 즉 static이 붙은 변수들에 실제 값을 할당해 준다.

    두 번째 단계인 Linking은 다시 3단계로 나뉘어서 수행된다.
     

    1. Verifying : Loading 단계에서 읽어들인 .class 파일이 명세에 맞게 만들어진 파일인지, 메서드 호출이 유효한지, 필드 접근이 허용되는지 등을 검증한다. (jdk 버전 호환성에 대한 검사도 포함된다.) 검증에 실패하면 verifyException을 발생시킨다.
    2. Preparing : Verifying을 통과하면 클래스의 정적 변수를 초기화해 준다. (일반적으로 기본값으로 초기화된다.) 또한, 현재 바이트 코드가 얼마만큼의 메모리(static, class etc..)가 필요한지 계산하여 할당한다.
    3. Resolving : 클래스나 인터페이스에 대해 실제 참조를 연결한다. 다른 클래스나 메서드에 대한 참조를 실제로 사용 가능한 메서드 주소나 런타임 엔티티로 변환하는 과정을 포함한다. 즉, constant pool에 있는 symbolic reference를 direct reference로 변환한다.
      1. constant pool : 리터럴 상수를 저장하고 class와 method에 대한 참조 값도 담고 있는 저장 메모리
      2. symbolic reference : 이름(Symbol)으로 참조
      3. direct reference : 실제 메모리 주소로 참조

     

    클래스 로더의 구조

    클래스 로더는 다음과 같이 Bootstrap Class Loader(최상단), Extensions Class Loader,  System Class Loader, User-Defined Class Loader 구조를 갖으며, 효율적인 클래스 로딩과 관리를 위해 계층 구조로 구성되어 있다. 이로 인해 부모 클래스 로더는 자식 클래스 로더로부터 클래스를 로드할 수 없고, 이처럼 클래스 로딩을 격리하여 각 계층 간 충돌을 방지한다.
     

    이미지 출처 : https://inor.tistory.com/4

     

    • Bootstrap Class Loader : JVM이 실행될 때 동작하는 클래스 로더
      • $JAVA_HOME/jre/lib에 있는 JVM을 실행할 때 가장 기본이 되는 라이브러리들을 로드하는 클래스 로더
      • 다른 클래스 로더와 다르게 자바가 아닌 네이티브(= 운영체제 또는 특정 플랫폼에 특정한 방식으로 종속된 기술 또는 코드)로 구현된 클래스 로더
    • Extensions Class Loader :
      • $JAVA_HOME/lib/ext/*.jar에 있는 클래스들을 로드
      • 별도의 CLASSPATH 설정 없이도 로딩이 된다.
    • System Class Loader :
      • CLASSPATH에 정의되거나 JVM 옵션에서 -cp, -classpath에 설정된 클래스들을 로드
      • 개발자가 작성한 Java 애플리케이션 코드와 라이브러리를 메모리에 로드(작성한 class 코드들을 포함)
    • User-Defined Class Loader :
      • 애플리케이션 코드에서 사용자가 직접 정의해서 사용하는 클래스 로더
      • 클래스 로더가 최초로 클래스를 로드할 때 *.class (바이트 코드 파일)에서 클래스에 대한 여러 정보룰 추출한다. 클래스 로더가 추출한 정보를 실행 중에 검사하고 조작하는 기술을 리플렉션(reflection)이라고 한다.

    출처 :

    반응형
    Comments