클래스 로더

정은영·2023년 9월 20일
1

Java

목록 보기
3/3

클래스 로더는 로딩, 링크, 초기화 순으로 진행됩니다.

로딩

클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 "메소드" 영역에 저장합니다.

이 때 메소드 영역에 저장하는 데이터는 다음과 같습니다.

  • FQCN(Fully Qualified Class Name) : 클래스가 속한 패키지명을 모두 포함한 클래스 이름을 말합니다.
  • 클래스인지 인터페이스인지 이늄인지 에 대한 정보를 저장합니다.
  • 클래스에 속한 메소드와 변수를 저장합니다.

로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 "힙" 영역에 저장합니다.


로딩을 할 때 세 가지 클래스 로더가 있습니다.

  • 부트 스트랩 클래스 로더 : 최상위 우선순위를 가진 클래스 로더로 JAVA_HOME\lib에 있는 코어 자바 API를 제공합니다.
  • 플랫폼 클래스 로더( = Extension class loader) : JAVA_HOME\lib\ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽습니다.
  • 애플리케이션 클래스 로더 : 애플리케이션 class path(애플리케이션을 실행할 때 주는 -classpath 옵션 또는 java.class.path 환경 변수의 값에 해당하는 위치)에서 클래스를 읽습니다.

ClassLoader.java를 살펴보면

  • 부트 스트랩 클래스 로더는 "jdk.boot.class.path.append"로 설정되어 있는 class path에서 class를 읽어옵니다.
  • 플랫폼 클래스 로더는 부트 스트랩 클래스 로더를 부모로 설정해줍니다.
  • 애플리케이션 클래스 로더는 java.class.pathjdk.module.main에서 값을 가져와서 해당 class path에서 class를 읽어옵니다.

링크

링크 과정도 크게 Verify, Prepare, Resolve 세 가지 과정으로 나눌 수 있습니다.

  • Verify: .class 파일 형식이 유효한지 체크합니다.
  • Prepare: 클래스 변수(static 변수)와 기본값에 필요한 메모리를 준비합니다.
  • Resolve: 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체합니다.
    • 이 과정은 Optional 입니다.

초기화

static 변수의 값을 할당합니다. static 블럭이 있다면 이 초기화 과정에서 실행됩니다.

0개의 댓글

관련 채용 정보