JVM ClassLoader

yuKeon·2024년 4월 17일
0

1. 클래스 로더란?

자바는 동적 로드 방식으로 클래스를 로드한다.
동적 로드는 컴파일 시점이 아닌 런타임 시점에 클래스를 로드하고 링크하는 것이다.
클래스 로더의 역할은 이 동적 로드를 담당하는 것이다.

클래스 로더는 JRE의 일부다.
JVM이 클래스를 요청하면 클래스 로더가 해당 클래스를 메모리에 로드한다.
클래스 로더가 동적 로드를 담당하면서 JVM은 애플리케이션 실행을 위해 코드를 알 필요가 없다.
또한, 필요한 클래스만 메모리에 로드되기 때문에 메모리도 효율적으로 사용할 수 있다.

2. 클래스 로더의 특징

2.1 계층 구조

클래스 로더끼리 부모-자식 관계를 이룬다.
최상위 클래스 로더는 부트스트랩 (클래스)로더다.

2.2 위임 모델

계층 구조를 바탕으로 클래스 로더끼리 로드를 위임하는 구조로 동작한다.
상위에서 하위로 내려가면서 요청을 처리할 로더를 찾는다.
만약 로더를 찾지 못하면 NoClassDefFoundError ClassNotFoundException이 발생한다.

2.3 가시성 제한

하위에서 상위 로더를 찾는 것은 가능하다.
상위에서 하위 로더를 찾는 것은 불가능하다.

2.4 언로드 불가

클래스를 로드할 수는 있지만 언로드는 불가능하다.
언로드란, 클래스 로더를 재생산하는 것이다.
예시) 테이블에 컬럼 추가가 불가능해서 테이블을 삭제하고 다시 만들기

3. 구성 요소

3.1 부트스트랩 클래스 로더

자바에서 클래스는 클래스 로더에 의해 인스턴스화 된다.
클래스 로더는 java.lang 패키지에 포함된 클래스다.
어디서 클래스 로더를 생성할까?

여기서 사용되는 것이 부트스트랩 클래스 로더다.
부트스트랩 클래스 로더는 JVM 실행과 함께 생성된다.
이후, JDK 내부 디렉토리에 있는 rt.jar핵심 라이브러리를 로드한다.
또한, 다른 클래스 로더의 부모 역할을 하며 네이티브 코드로 구현되어 있다.

3.2 익스텐션 클래스 로더

기본 자바 API를 제외한, JDK 확장 라이브러리에서 핵심 자바 클래스를 로드한다.

3.3 시스템 클래스 로더

부트스트랩, 익스텐션 클래스 로더는 JVM의 구성 요소를 로드하는 역할을 했다.
시스템 클래스 로더는 개발자가 작성한 클래스를 로드한다.
애플리케이션 수준의 클래스를 로드한다는 의미에서 애플리케이션 클래스 로더로 불린다.

4. 클래스 로드 과정

JVM이 요청한 클래스가 메모리에 로드되지 않았다면 어떤 과정을 거쳐 로드될까?

4.1 로딩

찾으려는 클래스를 JVM 메모리에 로드한다.

4.2 링킹

4.2.1 검증

로드한 클래스가 자바 언어 명세나 JVM 명세에 부합한 지 검증한다.

검증에 실패하면 java.lang.VerifyError 에러가 발생한다.

가장 복잡하고 시간이 오래 걸리는 단계다.

4.2.2 준비

클래스가 필요로 하는 메모리를 할당하고 클래스에 정의된 필드, 메서드, 인터페이스 등의 구조를 준비한다.

4.2.3 분석

클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경한다.

상수 풀(constant pool)
클래스 파일은 여러 영역이 존재하며 이 중 하나가 상수 풀이다.
상수 풀에는 특정 클래스의 코드를 실행하는 데 필요한 상수가 저장된다.
참고

심볼릭, 다이렉트 레퍼런스
심볼릭 레퍼런스 : 클래스 이름이나 기타 정보로 접근
다이렉트 레퍼런스 : 실제 메모리 주소로 직접 접근
참고

4.3 초기화

클래스 변수(static)들을 적절한 값으로 초기화한다.
static initializer을 수행하고, static 필드들을 설정된 값으로 초기화한다.

Ref

0개의 댓글