Java

Java - ClassLoader System

엔꾸꾸 2019. 10. 16. 21:12

ClassLoader System

 

 

클래스 로더

  • 클래스 로더의 처리 과정은 로딩, 링크, 초기화 3단계로 나뉜다.
  • 로딩 -> 링크 -> 초기화 순으로 진행된다.

 

로딩

  • 클래스 로더가 .class파일을 읽고, 내용에 따라 적절한 바이너리 데이터를 생성하고, 메소드 영역에 저장한다.

메소드 영역에 저장되는 데이터

  • FQCN

    • 풀패키지 경로
  • 클래스 인지 인터페이스 인지 Enum 인지 구분을 한다

  • 메소드와 변수

  • 로드가 끝나면 해당 클래스타입의 Class객체를 생성하여 힙 영역에 저장한다.

  • 클래스로더는 3개의 계층구조로 이루어져 있으며 3가지 기본 클래스 로더가 제공된다.

    • 부트스트랩 클래스 로더 (네이티브)
    • 플랫폼 클래스 로더
    • 애플리케이션 클래스 로더

부트스트랩 클래스 로더

  • JAVA_HOME\lib에 존재하는 코어 자바 API를 제공한다.
  • 최상위 우선순위를 가진다.

플랫폼 클래스 로더

  • JAVA_HOME\lib\ext 폴더 혹은 java.ext.dirs 시스템 변수에 해당하는 위치에 존재하는 클래스를 로드한다.

애플리케이션 클래스로더

  • 애플레케이션 클래스패스 에서 클래스를 로드한다.

클래스로더의 로드 과정

  • 1.부트스트랩 클래스 로더에게 요청한다.
  • 2.플랫폼 클래스 로더에게 요청한다.
  • 3.애플리케이션 클래스로더가 로드를 시도한다.
  • 4.모두 읽지 못한다면 ClassNotFoundException 예외가 발생한다.

 

링크

  • Verify
    • .class 파일의 형식이 유효한지 검증한다.
  • Prepare
    • 클래스 변수와와 기본값에 필요한 메모리를 준비하는 과정
  • Resolve (Optional)
    • 심볼릭 메모리 렌퍼런스를 메소드 영역에 존제하는 실제 레퍼런스로 교체한다.
    • 이때 발생할 수 있고, 실제로 사용할때 일어날수 도 있음

심볼릭 레퍼런스

  • 실제 레퍼런스를 가리키고 있지 않은 상태
  • 논리적인 레퍼런스이다.

 

초기화

  • static 변수의 값을 초기화한다
  • statc 블럭을 초기화한다.