클래스 로더란?


자바는 메모리를 효율적으로 관리하기 위해 모든 클래스를 한 번에 로딩하는 것이 아닌 필요할 때만 지연 로딩하는 방식을 사용한다. 이 동작을 가능하게 해 주는 것이 클래스 로더이다.

 

로드(loading)

  • 자바 바이트코드(.class)를 메소드 영역 다음과 같은 정보를 저장한다.
    • 로드된 클래스와 그 부모 클래스
    • 어떤 타입으로 선언됐는지 ex) class, interface, enum
    • 변수나 메서드 정보

링크(Linking)

  • 검증 : 로드된 클래스가 JVM 명세에 맞는지(오버/언더플로우, 올바른 명령어 등)를 검사한다.
  • 준비 : static 필드들의 메모리를 슬롯을 할당하고 기본값으로 초기화한다.
  • 분석 : 클래스에 심볼릭 참조(이름 기반 참조)를 직접 참조(메모리 주소)로 바꾼다.

초기화(Initialization)

  • 클래스 로딩과 링크가 끝난 뒤, 실제로 값을 초기화한다.

 

 

클래스 로더 종류


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

  • 최상위 클래스 로더이며 최소한의 자바 클래스를 로드한다.

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

  • Bootstrap 로더의 자식으로, JRE 설치 경로의 lib/ext/ (또는 java.ext.dirs) 디렉토리에 놓인 확장 JAR들을 로드합니다.

애플리케이션 클래스 로더(Application Class Loader)

  • 자바 프로그램 실행 시 지정한 Classpath에 있는 클래스 파일 혹은 jar에 속한 클래스들을 로드합니다.
  • 일반적으로 개발자가 작성한 .class 확장자 파일이 이에 해당한다
  • System Class Loader라고도 부른다.

 

 

클래스 로더의 3가지 원칙


위임원칙(Delegation Priciple)

  • 클래스 로딩 요청을 받으면 부모 클래스 로더에게 로드를 위임하고 최상위 클래스로더(Bootstrap)에서 부터 찾기 시작하여 찾지못하면 찾을 때 까지 자식에게로 계속 내려간다.
  • 이를 중복 로드를 하지않고 일관성을 확보한다.

가시성 원칙(Visibility Priciple)

  • 하위 클래스 로더는 상위 클래스 로더가 로딩한 클래스를 볼 수 있지만, 반대로 상위로더는 하위 로더가 로딩한 클래스를 볼 수 없다.
  • 이로써 시스템 전반의 클래스 충돌을 방지하고, 모듈화된 구조를 유지할 수 있다. 

유일성 원칙(Uniqueness Principle)

  • 동일한 이름의 클래스를, 부모가 이미 로드했다면 자식 로더는 다시 로드하지 않는다
  • 위임 원칙 덕분에 애플리케이션 전역에서 클래스의 중복없는 로드를 보장한다.

+ Recent posts