반응형
클래스 로더
- 계층형 ( 부모, 부모의 부모가 있음 )
동작 원리 : 제일 부모에게 읽어오도록, 못 읽으면, 그 다음 부모, 그 다음 부모, ... 본인이 읽어 오도록!
만약, 본인도 못 읽으면 ClassNotFoundExeption 발생..
org.springframework.boot.devtools.restart.classloader.RestartClassLoader@3c5c4354
sun.misc.Launcher$AppClassLoader@764c12b6
sun.misc.Launcher$ExtClassLoader@4462e14c
null // native code로 구현되어 있는 class loader...(부트스트랩 클래스로더)
- 로딩, 링크, 초기화 순으로 진행된다.
로딩
- 클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 “메소드” 영역에 저장.
이때 메소드 영역에 저장하는 데이터
- FQCN (Fully Qualified Class Name) : package + full package 경로 + class name (고유한 class 이름)
- 클래스 | 인터페이스 | 이늄 인지에 대한 정보
- 메소드와 변수 정보
- 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 “힙" 영역에 저장.
링크
-
Verify, Prepare, Reolve(optional) 세 단계로 나눠져 있다.
-
Verify: .class 파일 형식이 유효한지 체크한다.
-
Preparation: 클래스 변수(static 변수)와 기본값에 필요한 메모리 준비 과정
-
Resolve: 심볼릭 메모리 레퍼런스(클래스에서 다른 클래스의 객체를 생성.. 이 객체는 심볼릭 레퍼런스! 즉 실제(physical) 레퍼런스를 가리키고 있지 않다. 즉, 논리적 레퍼런스)를 메소드 영역에 있는 실제 레퍼런스(실제 인스턴스가 위치하는 heap의 위치)로 교체한다. -> optional!! (즉, 링크 시에 일어날 수도 있고, 실 상황에서 발생할 수 있다.)
초기화
-
Static 변수의 값을 할당한다. (static 블럭이 있다면 이때 실행된다.)
클래스 로더는 계층 구조로 이뤄져 있으면 기본적으로 세가지 클래스 로더가 제공된다.
-
부트 스트랩 클래스 로더 - JAVA_HOME\lib에 있는 코어 자바 API를 제공한다. 최상위 우선순위를 가진 클래스 로더
-
플랫폼 클래스로더 (익스탠션 클래스로더) - JAVA_HOME\lib\ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽는다.
-
애플리케이션 클래스로더 - 애플리케이션 클래스패스(애플리케이션 실행할 때 주는 -classpath 옵션 또는 java.class.path 환경 변수의 값에 해당하는 위치)에서 클래스를 읽는다.
반응형
'JAVA' 카테고리의 다른 글
byte code 조작 (0) | 2019.09.28 |
---|---|
Byte Code (0) | 2019.09.28 |
JVM (0) | 2019.09.28 |
JAVA, JVM, JDK, JRE (0) | 2019.09.27 |
G1 GC (0) | 2019.08.21 |