JVM은 Java Virtual Machine의 약자로 Java로 작성된 프로그램이 돌아가도록 만들어 주는 프로그램이다.
Java로 작성된 파일은 .class라는 확장자를 가진 파일로 변환이 되고, 이 파일이 JVM위에서 동작한다. 이때 미리 설치된 JVM은 운영체제 별로 동일하게 작동하도록 .class파일에게 작동 환경을 제공한다.
자바 어플리케이션은 WORA(Write Once Run Anywhere)이라고 불리는데, 이 의미는 프로그래머가 자바 코드를 한 시스템에서 개발할 수 있도록 하고, 어떤 조정도 없이 자바가 실행될 수 있는 어떤 시스템에서 실행되도록 한다.

class loader subsystemd에서는 크게 Loading, Linking, Initialization 이렇게 3가지 일을 한다.
Class loader가 .class파일을 읽고, 그에 대응되는 이진 데이터를 만들어 Method Area에 저장한다. .class파일에 대해서 JVM은 다음과 같은 정보를 Method Area에 저장한다.
After loading the “.class” file, JVM creates an object of type Class to represent this file in the heap memory. Please note that this object is of type Class predefined in java.lang package. These Class object can be used by the programmer for getting class level information like the name of the class, parent name, methods and variable information etc. To get this object reference we can use getClass() method of Object class.
위의 부분은 해석을 못함...
Linking에서 verification, preparation, 선택적으로 resolution을 수행한다.
이 단계에서는 모든 정적 변수들을 코드와 static block에 정의된 값으로 initializing한다. 이 과정은 부모클래스에서 부터 자식 클래스로 위에서부터 아래로 실행된다.(원문: This is executed from top to bottom in a class and from parent to child in the class hierarchy)

사진 출처: https://blog.hexabrain.net/397
JVM은 클래스 로딩 요청을 받을 클래스로더를 선택하기 위해 위임 계층을 따른다.
1.클래스 요청이 들어오면 가장 처음엔 application class loaderd에 들어오고
2. extension class loader에 해당 요청을 위임한다.
3. extension class loader는 다시 bootstap class loader에 위임하고
4. bootstrap class loader는 bootstrap class path(JAVA_HOME/jre/lib)에 해당 클래스가 있으면 클래스를 로드하고
5. 없으면 extension class loader에게 위임한다.
6. extension클래스 로더에선 extension class path(JAVA_HOME_jre/lib/ext)에서 해당 클래스가 있는지 확인하고 있으면 로드하고
7. 없으면 application class loader에게 위임한다.
8. application class loader는 환경변수 classpath에서 클래스를 검색하고
9. 만약 클래스를 찾지 못하면 런타임 예외인 java.lang.ClassNotFountException을 발생시킨다.
https://tecoble.techcourse.co.kr/post/2021-07-12-jvm-jre-jdk/