Java

[Java] 클래스 로더

재담 2022. 2. 15. 22:59

클래스 로더

  • 로딩 -> 링크 -> 초기화 순으로 진행
  • 계층 구조
    1. 부트 스트랩 클래스 로더 : JAVA_HOME\lib에 있는 코어 자바 API 제공하며 최상위 우선순위
    2. 플랫폼 클래스 로더 : JAVA_HOME\lib\ext 폴더 또는 java.ext.dirs 환경 변수에 해당하는 위치에 있는 클래스를 읽음
    3. 애플리케이션 클래스 로더 : -classpath 옵션 또는 java.class.path 환경 변수의 값에 해당하는 위치에 있는 클래스를 읽음

 

로딩

  • 클래스 로더가 .class 파일을 읽고 내용에 따라 적절한 바이너리 데이터 생성 후 메서드 영역에 저장
  • 메서드 영역에 저장하는 데이터
    1. FQCN(Fully Qualified Class Name) : 패키지 이름 + 클래스 이름 (+클래스 로더)
    2. 클래스, 인터페이스, Enum
    3. 메서드, 변수
  • 로딩 종료 후 해당 클래스 타입의 Class 객체를 생성하여 힙 영역에 저장

 

링크

  • Verify -> Prepare -> Resolve(optional)
  • Verify : .class 파일 형식이 유효한지 체크
  • Prepare : 클래스 변수(static 변수)와 기본값에 필요한 메모리
  • Resolve(optional) : 심볼릭 메모리 레퍼런스를 메서드 영역에 있는 실제 레퍼런스로 교체

 

초기화

  • static 변수의 값을 할당 (static 블록이 있다면 실행)

Reference