본문 바로가기
Java

[Java] 클래스로더(Class loader)

by 가드 2022. 11. 10.
728x90

자바 애플리케이션 실행 과정

class loader

  1. 컴파일러를 통하여 자바 소스파일인. java를 바이트코드(.class) 파일로 변환한다.
  2. 클래스 로더가 요청에 의한 바이트코드(.class)를 JVM 메모리에 로드한다.
  3. 실행 엔진이 JVM 메모리에 실행하고자 하는 바이트코드가(.class)를 실행하며 만약 바이트코드(.class)가 없으면 클래스 로더에게 요청하여 바이트코드(.class)를 로드한다.

클래스 로드 과정

첫번째. 로딩 과정

바이트코드(.class) 파일을 메모리에 로드하는 것으로 클래스 로드의 가장 주요한 작업이다.

사용시점(필요 시점)에 의해 바이트코드를 JVM 메모리에 로드한다.

두 번째. 링킹 과정

로드된 클래스나 인터페이스 등을 검증하고 준비하고 해석하는 과정을 거치는 단계이다.

  1. 검증 단계 : 바이트코드(.class)가 자바언어 명세서(Java Language Specification)에 따라서 코드를 작성했는지 클래스 생성에 문제가 유무 등을 검증하여 바이트코드(.class) 파일의 정확성을 보장하는 단계
  2. 준비 단계 : 바이트코드(.class)가 JVM 메모리에 로드되기 전에 필요한 메모리 크기를 미리 할당하는 단계인데 이때 메모리가 부족하게 되면 java.lang.OutOfMemoryError가 발생하게 된다.
  3. 분석 단계 : 바이트코드(.class) 참조하는 객체의 메모리 주소 값을 대입하는 단계

세 번째. 초기화 과정

로드된 클래스, 인터페이스 초기화 로직이 실행되는 과정을 거치게 되는데 정적 변수는 코드에 명시된 값들을 할당하며 정적 초기화 블록이 실행되는 등 클래드 로드의 마지막 과정이다. 클래스 계층 구조에 따라 부모에서 자식 클래스까지 한 줄씩 실행된다.

클래스 로드 종류

class loader

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

자바에서 기본적으로 제공하는 API와 표준 JDK 클래스들을 Bootstrap ClassPath에서 로드하게 된다.

"JAVA_HOME/jre/lib/" 디렉터리에 있는 rt.jar에서 로드이며 모든 클래스 로더의 최상위 부모이다.

확장 클래스로더(Extension Class Loader)

자바의 기본적인 클래스(부트스트랩 클래스 로드)를 제외한 확장된 클래스들을 로드한다. (보안 확장 기능)

"JAVA_HOME/jre/lib/ext/" 확장 디렉터리에 있는 *.jar에서 로드되며 sun.misc.Launcher$ExtClassLoader 클래스로 자바에 구현되어있다.

시스템 클래스 로더(System Class Loader)

Classpath나 JVM Option에서 -cp, -classpath에서 지정한 클래스들을 로드한다.

즉, 사용자(개발자)가 직접 지정한 클래스들을 로드하는 것.

사용자 정의 클래스 로더(User-Defined Class Loader) 

애플리케이션 사용자(개발자)가 코드상으로 생성하여 사용하는 클래스들이 로드한다.

 

클래스를 로드할 때 최상위 클래스 로더인 부트스트랩 클래스 로더부터 ~ 사용자 정의 클래스 로더까지 해당되는 클래스 로더들을 실행해가며 클래스를 로드하는 과정을 거친다.

300x250

댓글