티스토리 뷰
목차
클래스 로더(class loader)
클래스를 로딩하는 기능을 담당한다.
클래스 로더는 java 파일을 class 파일로 java 컴파일러가 컴파일하고 나면, 이를 수행할 수 있게 번역하고 가공해 준다.다시 말해서 .class 파일을 읽고 → 올바른 명세인지 확인 → 메모리 할당 → 필요한 변수들을 초기화 과정을 진행하여 JVM에서 클래스들을 실행하기 위한 작업을 진행하고 Java 애플리케이션이 실행되는 역할을 한다.
클래스 로더의 역할
- 클래스 로딩 : 클래스 파일을 로드하여 메서드 영역에 클래스의 정보를 저장한다. 이 때, 메서드 영역에 저장되는 클래스의 정보는 클래스의 바이트 코드, 메서드, 변수, 메타데이터등이 포함된다.
- 중복 로딩 방지 : 클래스 로더는 중복 로딩을 방지하기 위해 이미 로딩된 클래스는 다시 로드하지 않는다. 이를 통해, 메모리를 효율적으로 관리한다.
- 클래스 초기화 : 클래스를 초기화하여 클래스 변수의 초기화 및 정적 블록 실행을 관리해 준다.
- 클래스 언로딩 : 일부 JVM은 더 이상 필요하지 않은 클래스를 메모리에서 해제하는 기능을 제공한다.
클래스 로더의 진행 단계
Loading -> Linking(Verifying -> Preparing -> Resolving) -> Initializing 단계로 클래스 로딩을 진행하며, 각 단계의 구체적인 역할은 다음과 같다.
- Loading : javac를 통해 만들어진 .class 파일을 최초로 읽는 역할
- static main 메서드부터 읽기 시작한다.
- Linking : Loading 단계에서 읽어 들인 바이트 코드에 대해 연관관계(Reference)가 있는 코드끼리 다시 연결해 준다.
- 연관관계가 있는 코드를 연결이란? 클래스 파일에서 사용되는 다른 클래스나 메서드, 필드 등의 실제 위치를 연결해 준다.
- Initializing
- 클래스 변수를 초기화한다. 즉 static이 붙은 변수들에 실제 값을 할당해 준다.
두 번째 단계인 Linking은 다시 3단계로 나뉘어서 수행된다.
- Verifying : Loading 단계에서 읽어들인 .class 파일이 명세에 맞게 만들어진 파일인지, 메서드 호출이 유효한지, 필드 접근이 허용되는지 등을 검증한다. (jdk 버전 호환성에 대한 검사도 포함된다.) 검증에 실패하면 verifyException을 발생시킨다.
- Preparing : Verifying을 통과하면 클래스의 정적 변수를 초기화해 준다. (일반적으로 기본값으로 초기화된다.) 또한, 현재 바이트 코드가 얼마만큼의 메모리(static, class etc..)가 필요한지 계산하여 할당한다.
- Resolving : 클래스나 인터페이스에 대해 실제 참조를 연결한다. 다른 클래스나 메서드에 대한 참조를 실제로 사용 가능한 메서드 주소나 런타임 엔티티로 변환하는 과정을 포함한다. 즉, constant pool에 있는 symbolic reference를 direct reference로 변환한다.
- constant pool : 리터럴 상수를 저장하고 class와 method에 대한 참조 값도 담고 있는 저장 메모리
- symbolic reference : 이름(Symbol)으로 참조
- direct reference : 실제 메모리 주소로 참조
클래스 로더의 구조
클래스 로더는 다음과 같이 Bootstrap Class Loader(최상단), Extensions Class Loader, System Class Loader, User-Defined Class Loader 구조를 갖으며, 효율적인 클래스 로딩과 관리를 위해 계층 구조로 구성되어 있다. 이로 인해 부모 클래스 로더는 자식 클래스 로더로부터 클래스를 로드할 수 없고, 이처럼 클래스 로딩을 격리하여 각 계층 간 충돌을 방지한다.
- 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)이라고 한다.
출처 :
- 이것이 자바다
- https://inor.tistory.com/4
'Java & Kotlin' 카테고리의 다른 글
[Java] 예외와 예외 처리 (1) | 2023.12.02 |
---|---|
[Java] 멀티모듈 프로젝트(응용 프로그램 모듈화하여 구성하기) (0) | 2023.11.20 |
[Java] 추상 클래스와 인터페이스의 개념과 차이점 (2) | 2023.11.15 |
[Java] JVM 구조와 메모리 사용영역, Java 쓰레드와 메모리 구조 (1) | 2023.11.05 |
[Java] Builder 패턴의 장점과 사용시 유의사항(Builder 패턴을 사용해야하는 이유) (0) | 2023.11.03 |
Comments