본문 바로가기

gyub's 공부일기/Java

[JAVA] JVM 클래스로더

클래스로더의 역할은 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) 결론적으로 위에서 아래로 계층적으로 진행됩니다. (아래 그림 참고)

 

 

 

반응형