클래스로더의 역할은 Loading, Linking, Initialization로 3가지가 있습니다.
1) Loading: 클래스로더는 .class 파일을 읽어 바이트 코드를 메서드 영역에 저장합니다.
각 파일은 JVM에 의해 메서드 영역에 다음의 정보들을 저장합니다.
- 로드된 클래스를 비롯한 그의 부모 클래스의 정보
- class 파일이 다른 Class, Interface, Enum과의 관련한 정보
- 변수나 메서드의 정보 등
.class 파일이 로딩된 후에는 JVM은 힙 메모리 영역에 이 파일이 나타내는 클래스 유형의 객체를 생성합니다.
2) Linking: 증명(verification), 준비(preparation), 해결(resolution) 3가지를 수행합니다.
- 증명: .class 파일의 정확성을 보장합니다.즉, 파일이 적절히 포맷되었는지, 유효한 컴파일러에 의해 생성되었는지 확인합니다. 만약 검증이 실패한다면 런타임 에러가 날 것입니다. (java.lang.VerifyError)
- 준비: JVM은 메모리를 기본 값으로 초기화 한 후, 클래스 변수(static 변수)들을 위한 메모리에 할당합니다.
- 해결: 논리적 레퍼런스를 메서드 영역에 있는 실제 레퍼런스로 교체합니다.( 이 과정은 옵션 )
* 논리적 레퍼런스: 참고하는 클래스의 특정 메모리 주소를 참조 관계로 구성한 것이 아닌 참조하는 대상의 이름만을 지칭한 것
3) Initialization: 모든 정적 변수들을 정의된 값으로 초기화 시킵니다.
ex) static String name = "gyubin"; // 호출
클래스로더 동작 방식
1) JVM은 클래스들을 로드하기 위해 위임-계층 원리를 따릅니다.
2) 시스템 클래스로더는 로드 요청을 확장 클래스로더로 위임하고, 확장 클래스로더는 부트 스트랩 클래스로더로 위임하게 된다.
3) 이렇게 먼저 부트스트랩 클래스로더에서 클래스를 찾지 못 하면, 확장 클래스로더에서 찾고, 찾지 못 하면, 시스템 클래스로더에서 찾게된다.
4) 마지막으로 시스템 클래스로더에서도 클래스 로드를 실패한다면, 우리는 java.lang.ClassNotFoundException 런타임 에러를 볼 수 있다.
5) 결론적으로 위에서 아래로 계층적으로 진행됩니다. (아래 그림 참고)
'gyub's 공부일기 > Java' 카테고리의 다른 글
[ JAVA ] 자바는 call by value? call by reference? (1) | 2021.03.27 |
---|---|
[ JAVA ] 참조란? (3) | 2021.03.24 |
[ JAVA ] JAVA의 동작 방식와 JVM 메모리 구조 (0) | 2020.11.30 |
[ JAVA ] Java의 특징 및 JVM, JDK, JRE (0) | 2020.11.29 |