클래스 로더란?
- 자바의 동작과정 중 컴파일러가 바이트코드로 변환해 그 바이트코드를 JVM에서 해석
- 런타임(바이트코드 실행) 중에 Java 클래스를 JVM (Java Virtual Machine)에 동적으로 로드하는 역할
- 동적로드라 함은 모든 클래스를 메모리에 한번에 올리지 않는다(메모리 낭비 방지)
- 클래스 로더의 단계
- 로딩
- 자바 바이트 코드를 메소드 영역에 저장
- 링크
- 검증: 읽어 들인 클래스가 자바 언어 명세 및 JVM 명세에 명시된 대로 잘 구성되어 있는지 검사
- 준비: 클래스가 필요로 하는 메모리를 할당 클래스에서 정의된 필드, 메소드, 인터페이스를 나타내는 데이터 구조를 준비
- 분석: 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체
- 초기화
- 클래스 변수들을 적절한 값으로 초기화 한다. 즉, static 필드들이 설정된 값으로 초기화
클래스 로더 과정
1. 로딩
2. 링크 (3단계)
- 검증
- 준비
- 분석
- 클래스가 참조하는 객체의 실제 메모리 주소값 대입
3. 초기화
클래스로더는 동적 로딩방식을 사용하기에 클래스를 한번에 모두다 메모리에 다 올리지 않는다
클래스로더에 클래스를 올려달라는 요청을 받으면 클래스로더는 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파일 로드)
클래스로더의 동작 방식
- JVM 메모리 영역에 해당 클래스가 있는지 확인
- 없다면 Application ClassLoader에 클래스 로드 요청
- Appication ClassLoader은 Extention ClassLoader에 요청 위임
- Extention ClassLoader은 BootStrap ClassLoader에 요청 위임
- 부트스트랩 클래스로더에 해당 클래스가 있는지 확인 없다면 확장 클래스로더에 요청
- 확장 클래스로더에 해당 클래스가 있는지 확인 없다면 어플리케이션 클래스로더에 요청
- 시스템 클래스 로더는 시스템 Classpath에 해당 클래스가 있는지 확인한다.
클래스가 존재하지 않는 경우 ClassNotFoundException을 발생
클래스로더의 원칙
- 위임 원칙
- 클래스 로더는 클래스 또는 리소스를 찾기 위해 요청을 받았을 때, 상위 클래스 로더에게 책임을 위임하는 위임 모델을 따른다
- 가시 범위 원칙
- 하위 클래스 로더는 상위 클래스 로더가 로드한 클래스를 볼 수 있지만, 반대로 상위 클래스 로더는 하위 클래스 로더가 로드한 클래스를 알 수 없다
- 유일성의 원칙
- 하위 클래스 로더가 상위 클래스 로더에게 로드한 클래스를 다시 로드하지 않아야 한다는 원칙
클래스 로딩 시점
- 클래스의 인스턴스 생성 시 클래스 로딩
- 클래스의 정적(static)변수 이용(final x)
- 클래스의 정적(static) 메소드 호출
클래스 로딩하지 않을 때
- 클래스 접근x
- 클래스 정적(static)변수 이용(final o)