자바를 공부하면서 근본적인 JVM의 동작 방법들을 알고 넘어가야겠다는 생각이 들었다.
그래서 오늘은 자바 클래스로더에 대해 알아보고 두번 세번 보았을때 더 빠르게 이해할 수 있도록 메모해보자
자바로 작성된 클래스 파일은 JVM 위에서 동작한다. 직접 운영체제 위에서 동작하지 않기 때문에 높은 이식성을 가질 수 있게 되었다.
자바 클래스로더는 컴파일된 클래스 파일을 JVM위로 올리는(Load) 동작을 수행한다.
자바 클래스로더란?
자바는 컴파일 타임이 아니라 런타임(바이트 코드를 실행할 때)에 클래스 로드하고 링크하는 특징(동적 로드)이 있다.
이 동적 로드를 담당하는 부분이 JVM의 메소드 영역에 동적으로 Java클래스를 로드하는 역할을 한다.
클래스로더에는 로딩,링크,초기화 단계로 나눠져 있다.
🔸로딩(Loading)
- 자바 바이트 코드(= .class)를 메소드 영역에 저장한다.
- 각 자바 바이트코드(= .class)는 JVM에 의해 메소드 영역에 다음 정보들을 저장한다.
- 로드된 클래스를 비롯한 그의 부모 클래스의 정보
- 클래스 파일과 Class, Interface, Enum의 관련 여부
- 변수나 메소드 등의 정보
- 이 과정에서 .class파일이 JVM스펙에 맞는지 확인하고 Java 버전을 확인한다.
🔸링크(Linking)
- 검증 : 읽어들인 클래스의 바이너리 데이터가 유효한 것인지 확인.
.class 파일 형식이 유효한지 여러가지 체크를 한 다음 믿을 수 있는 .class 파일 데이터인 경우만 진행.
[이 과정은 다소 오버헤드가 발생하기 때문에 classpath에 믿을 수 있는 class 파일만 있는 경우라면
성능 향상을 위해 진행 하지 않도록 설정 가능] ( -Xverify:none ) 이 옵션으로 검증 패스 가능
- 준비 : 클래스가 필요로 하는 메모리를 할당하고, 클래스에서 정의된 필드, 메소드, 인터페이스를 나타내는
데이터 구조를 준비한다.
클래스의 static 변수와 기본값에 필요한 메모리 공간을 준비.
- 분석 : 선택적으로 진행되는 과정으로 사용하는 환경에 따라 동작 유무가 정해진다.
심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 힙 메모리 영역에 있는 인스턴스에 대한 레퍼런스로 교체해준다.
*Constant Pool의 *심볼릭 레퍼런스를 다이렉트 레퍼런스(실제 메모리 주소값) 으로 변경해주는 작업을 한다.
*Constant Pool : 런타임에 생성되는 Static 상수 저장소이다.
[https://jiwondev.tistory.com/114]
*심볼릭 레퍼런스 :기본 자료형(primitive data type)을 제외한 모든 타입(클래스와 인터페이스)을 명시적인 메모리 주소 기반의 레퍼런스가 아니라 심볼릭 레퍼런스를 통해 참조한다.
[https://antstudy.tistory.com/178]
(위 내용들은 간단하게 끝날 내용이 아닌것 같다 이 주제로 새로 글을 작성 해봐야겠다!)
🔸초기화(Initializing)
- 클래스 변수들을 적절한 값으로 초기화 한다. 즉 static필드들이 설정된 값으로 초기화한다.
.... 계속 작성중.....
참고사이트