티스토리 뷰


자바 코드 수행 과정을 보면 이렇다.

테두리 친 부분이 JVM 영역이고 하나씩 봐야겠다.


클래스 로더(Class Loader)

▶ 특징

 1) 계층구조 : 클래스 로더끼리 부모-자식 관계를 이루어 계층구조 (최상위 = 부트스트랩)

 2) 위임모델 : 클래스 로더끼리 로드 위임 (상위클래스 로더 확인 → 상위클래스 있다면 해당 클래스 사용)

 3) 가시성 제한 : 하위 클래스 로더는 상위클래스 로더의 클래스를 찾을 수 있지만 상위는 하위를 찾을 수 없음.

 4) 언로드 불가 : 클래스 로더는 클래스 로드만 가능 (but 현재 클래스 로더 삭제 → 새로운 클래스 로더 생성하는 방법으로 사용)

▶ 로드된 클래스들을 보관하는 네임스페이스 갖음.

▶ 클래스 로드 시 이미 로드된 클래스인지 확인 위해서 네임스페이스에 보관된 FQCN(Full Qualified Class Name) 기준으로 클래스 찾음.

    (FQCN이 같더라도 네임스페이스가 다르면 (=다른 클래스 로더가 로드한 클래스라면) 다른 클래스로 간주)

    (FQCN : 클래스가 속한 패키지명을 모두 포함한 이름 (java.lang.String s = new java.lang.String();)

▶ 클래스 로더가 클래스 로드를 요청 받으면 다음 순서로 클래스 여부 확인.

    클래스 로더 캐시(cash) → 상위 클래스 로더 → 자기자신


클래스 로더 위임 모델


1) Bootstrap Class Loader : JVM 기동 시 생성 / Object 클래스와 자바 API 로드 / Native Code로 구현되어 있음.

2) Extension Class Loader : 기본 자바 API를 제외한 확장 클래스 로드 (보안 확장 기능 로드)

3) System Class Loader : 애플리케이션 클래스 로드 / 사용자가 지정한 $CLASSPATH 내의 클래스 로드

4) User-Defined Class Loader : 애플리케이션 사용자가 직접 코드 상에서 생성해 사용하는 클래스 로더

    

클래스 로드 과정 


1) Loading

- 클래스를 파일에 가져와서 JVM 메모리에 로드

2) Verifying(검증)

- 읽어들인 클래스가 자바 언어 명세 및 JVM 명세에 명시된 대로 잘 구성되어 있는지 검사

- 클래스 로드 과정 중 가장 까다로운 검사를 수행하는 과정(가장 복잡, 시간 오래 소요)

3) Preparing(준비)

- 클래스가 필요로 하는 메모리를 할당

- 클래스에서 정의된 필드, 메소드, 인터페이스들을 나타내는 데이터 구조 준비

4) Resolving(분석) 

- 클래스의 상수풀 내 모든 심볼릭 레퍼런스 → 다이렉트 레퍼런스로 변경 → 참조된 모든 클래스 로딩

( * 심볼릭 레퍼런스 : 참조하고자 하는 대상의 이름만으로 참조관계 구성

  * 다이렉트 레퍼런스 : 이름에 맞는 객체의 주소를 찾아서 연결 )

5) 초기화

- 클래스 변수들을 적절한 값으로 초기화, Static initializer 수행



Reference

https://d2.naver.com/helloworld/1230

댓글