[JVM] Class Loader

Minuuu·2022년 12월 24일
0

Java

목록 보기
3/18
post-thumbnail

클래스 로더란?

  • 자바의 동작과정 중 컴파일러가 바이트코드로 변환해 그 바이트코드를 JVM에서 해석
  • 런타임(바이트코드 실행) 중에 Java 클래스를 JVM (Java Virtual Machine)에 동적으로 로드하는 역할
  • 동적로드라 함은 모든 클래스를 메모리에 한번에 올리지 않는다(메모리 낭비 방지)
  • 클래스 로더의 단계
    - 로딩
        - 자바 바이트 코드를 메소드 영역에 저장
    - 링크
        - 검증: 읽어 들인 클래스가 자바 언어 명세 및 JVM 명세에 명시된 대로 잘 구성되어 있는지 검사
        - 준비: 클래스가 필요로 하는 메모리를 할당 클래스에서 정의된 필드, 메소드, 인터페이스를 나타내는 데이터 구조를 준비
        - 분석: 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체
    - 초기화
        - 클래스 변수들을 적절한 값으로 초기화 한다. 즉, static 필드들이 설정된 값으로 초기화

클래스 로더 과정

1. 로딩

  • 바이트코드를 JVM 메모리에 로드하는 과정

2. 링크 (3단계)

  1. 검증
    • 바이트코드가 java 규칙을 따르는지 검증
  2. 준비
    • 클래스의 필요한 메모리 할당
  3. 분석
    • 클래스가 참조하는 객체의 실제 메모리 주소값 대입

3. 초기화

  • 클래스의 static 변수값 할당

클래스로더는 동적 로딩방식을 사용하기에 클래스를 한번에 모두다 메모리에 다 올리지 않는다
클래스로더에 클래스를 올려달라는 요청을 받으면 클래스로더는 3가지 단계로 동작
1. 캐시(미리 불러온것을 저장)에 해당 클래스가 있는지 확인 -> 이미 불러온적이 있는지 확인
2. 상위 클래스 로더에서 확인(해당 클래스가 있는지)
3. 없으면 본인 클래스로더(하위)에서 클래스를 가져온다

즉, 클래스로드 요청을 받으면
1. 이전에 클래스 요청을 받은지 확인하고 -> 상위 클래스로더 -> 하위 클래스로더(본인)에서 클래스 로드

클래스로더의 종류

1. Bootstrap ClassLoader

  • JVM을 실행할 때 가장 먼저 실행
  • 자바의 기본적인 클래스 로드(java.lang.Object, Class, ClassLoader)
  • Java 클래스는 java.lang.ClassLoader 인스턴스에 의해 로드 -> BootStrap ClassLoader가 동작시킨다
  • 모든 ClassLoader 인스턴스 의 부모

2. Extension ClassLoader(확장 클래스로더)

  • 자바 기본 클래스를 제외한 확장 클래스 로드

3. Application ClassLoader(System ClassLoader)

  • 자바 실행 시 classpath 클래스 로드(우리가 만든 .class파일 로드)

클래스로더의 동작 방식

  1. JVM 메모리 영역에 해당 클래스가 있는지 확인
  2. 없다면 Application ClassLoader에 클래스 로드 요청
  3. Appication ClassLoader은 Extention ClassLoader에 요청 위임
  4. Extention ClassLoader은 BootStrap ClassLoader에 요청 위임
  5. 부트스트랩 클래스로더에 해당 클래스가 있는지 확인 없다면 확장 클래스로더에 요청
  6. 확장 클래스로더에 해당 클래스가 있는지 확인 없다면 어플리케이션 클래스로더에 요청
  7. 시스템 클래스 로더는 시스템 Classpath에 해당 클래스가 있는지 확인한다.
    클래스가 존재하지 않는 경우 ClassNotFoundException을 발생

클래스로더의 원칙

  • 위임 원칙
    - 클래스 로더는 클래스 또는 리소스를 찾기 위해 요청을 받았을 때, 상위 클래스 로더에게 책임을 위임하는 위임 모델을 따른다
  • 가시 범위 원칙
    - 하위 클래스 로더는 상위 클래스 로더가 로드한 클래스를 볼 수 있지만, 반대로 상위 클래스 로더는   하위 클래스 로더가 로드한 클래스를 알 수 없다
  • 유일성의 원칙
    - 하위 클래스 로더가 상위 클래스 로더에게 로드한 클래스를 다시 로드하지 않아야 한다는 원칙

클래스 로딩 시점

  • 클래스의 인스턴스 생성 시 클래스 로딩
  • 클래스의 정적(static)변수 이용(final x)
  • 클래스의 정적(static) 메소드 호출

클래스 로딩하지 않을 때

  • 클래스 접근x
  • 클래스 정적(static)변수 이용(final o)
profile
꾸준히 한걸음씩 나아가려고 하는 학부생입니다 😄

0개의 댓글