Dev 달팽이 @_''

Java - 클래스 로더 본문

Java&Spring/더 자바, 코드를 조작하는 다양한 방법

Java - 클래스 로더

다본죽 2022. 1. 7. 00:11

Java - 클래스 로더

 

클래스 로더

  • 로딩, 링크, 초기화 순으로 진행
  • 로딩
    • 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 "메소드" 영역에 저장.
    • 이 때 메소드 영역에 저장하는 데이터
      • FQCN(Fully Qualified Class Name)
      • 클래스 | 인터페이스 | 이늄
      • 메소드와 변수
    • 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 "힙" 영역에 저장
  • 링크
    • Verify, Prepare, Resolve(optional) 세 단계로 나뉘어져 있다.
    • Verify : .class 파일 형식이 유효한지 체크
    • Preparation : 클래스 변수(static 변수)와 기본값에 필요한 메모리
    • Resolve : 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체
  • 초기화
    • static 변수의 값을 할당한다. (static 블럭이 있다면 이때 실행)
  • 클래스 로더는 계층구조로 이루어져 있으며 기본적으로 세가지 클래스 로더가 제공된다.
    • 부트 스트랩 클래스 로더 - JAVA_HOME\lib에 있는 코어 자바 API를 제공한다. 최상위 우선순위를 가진 클래스 로더
    • 플랫폼 클래스 로더 - JAVA_HOME\lib\ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽는다.
    • 애플리케이션 클래스 로더 - 애클리케이션 클래스 패스(애클리케이션 실행할 때 주는 -classpath 옵션 또는 java.class.path 환경 변수의 값에 해당하는 위치)에서 클래스를 읽는다.
    • 최상위 클래스 로더인 부트 스트랩 클래스 로더부터 읽는다. 이를 못읽으면 하위 클래스 로더로 내려가면서 읽기를 시도한다.