클래스 로더
- 실행 시, 필요한 클래스를 동적으로 메모리에 로드한다.
- 기존에 생성된 클래스 객체가 메모리에 존재하는지 확인한다. 메모리에 존재하면 객체의 참조를 반환하고, 없으면 클래스 패스에 지정된 경로를 따라서 클래스 파일을 찾는다.
- 로딩, 링크, 초기화 순으로 진행된다.
로딩
- 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 "메소드" 영역에 저장
- 메소드 영역에 젖아하는 데이터
- FQCN (Full Qualified Class Name)
- 클래스 | 인터페이스 | 이늄
- 메소드와 변수
- 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 "힙" 영역에 저장
링크
- Verify, Prepare, Resolve(optional) 세 단계로 나눠져 있다.
- 검증 (Verify)
- .class 파일 형식이 유효한지 체크한다.
- Preparation : 클래스 변수(static 변수)와 기본 값에 필요한 메모리
- Resolve : 심볼릭 메모리 레퍼런스를 메소드 여역에 있는 실제 레퍼런스로 교체한다.
- 검증 (Verify)
초기화
- static 변수의 값을 할당한다. (static 블럭이 있으면 이때 실행된다.)
- 클래스 로더는 계층 구조로 이뤄져 있으며, 기본적으로 세가지 클래스 로더가 제공된다.
- 부트스트랩 클래스 로더 : JAVA_HOME/lib 에 있는 코어 자바 API 를 제공한다.
- 플랫폼 클래스로더 : JAVA_HOME/lib/ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽는다.
- 애플리케이션 클래스로더 : 애플리케이션 클래스패스에서 클래스를 읽는다
'Java' 카테고리의 다른 글
Class 객체 (0) | 2021.11.30 |
---|---|
애너테이션 (Annotation) (0) | 2021.11.29 |
OpenJDK 버전 변경하며 사용하는 방법 (0) | 2021.10.20 |
try-with-resources 를 사용하자 (0) | 2021.06.28 |
Reflection 을 이용해 Interface 정보 얻기 (0) | 2021.05.03 |