클래스 로더 시스템은 이름에서 알 수 있다시피 클래스들을 메모리에 올려놔주는 역할을 한다. 이 메모리에 올리는 작업을 로딩, 링크, 초기화 로 세분화할 수 있다.
Loading is the process of finding the binary representation of a class or interface type with a particular name and creating a class or interface from that binary representation.
로딩이란 특정한 이름을 가진 클래스 또는 인터페이스 이진 표현을 찾아내고 클래스 또는 인터페이스를 생성하는 과정입니다.
(※ 확실하진 않지만 아마 위에서 언급된 이진 표현은 아마도 바이트코드를 의미하는 것 같다.)
📚 JVM Specification
즉, 로딩할 녀석들의 이름을 찾아서 메모리(메서드영역)에 올리는 작업을 뜻한다. 다 올리고나면 Class 객체를 힙영역에 저장시킨다. Class 는 클래스들의 메타정보들을 따로 모아 보관하며 인스턴스 객체가 생성되어 힙에 저장이 된다.
new Test(); //여기 까지 완성 된 상태
Linking is the process of taking a class or interface and combining it into the run-time state of the Java Virtual Machine so that it can be executed.
링킹(Linking)은 클래스 또는 인터페이스를 가져오고 JVM의 실행 상태와 결합함으로써 실행될 수 있게 하는 작업을 말한다.
📚 JVM Specification
번역을 하니깐 이상해지는데, 쉽게 말해 실행 환경에 적합한 상태로 만드는 과정을 뜻한다. 로딩 과정에서 메모리에 로드 까지 되었으니 이제 실행 될 수 있게끔 작업을 해줘야한다.
대표적으로 verification, preparation, resoultion 이 있다.
class Test{
static int num; // num 에는 0이 기본으로 저장된다.
}
Test test = new Test();
Initialization of a class or interface consists of executing its class or interface initialization method
클래스 혹은 인터페이스의 초기화는 해당 클래스 또는 인터페이스의 초기화 메서드를 실행하는걸 말한다.
(※ 여기서 말한 초기화 메서드는 생성자가 아니라
cinit이라 불리는 특수 메서드이다.)
초기화 과정에서는 cinit 메서드에 의해 클래스 레벨에서 정적 변수 및 정적 초기화 블록이 실행되며 클래스 로딩 시 한 번만 호출이 된다.
static String name = "김";
클래스 로더 시스템에 대해 조금 간략히 살펴보았으며 더 자세한 내용은 다음 챕터에서 다뤄볼것이다.
JVM 은 고유의 메모리 영역을 가지고 있고 고유의 메모리 구조를 형성하고 있다.
스택, PC, 네이티브 메서드 스택 는 스레드별로 할당되는 메모리 영역인 반면 힙, 메서드 영역은 모든 스레드가 공유 하는 메모리 영역이다.
실행 엔진은 JVM(Java Virtual Machine)의 핵심 구성 요소 중 하나로, 자바 바이트코드를 실제 기계어로 변환하고 이를 실행하는 작업을 수행한다.
바이트 코드를 한줄 씩 실행 한다.
📚 참고 자료