자바 코드를 자바 컴파일러가 바이트코드로 변환한다.
변환된 바이트코드를 JVM내의 자바 클래스로더가 런타임 메모리 영역에 올린다.
JVM내의 실행 엔진(Execution Engine)이 이 코드를 실행한다.
실행중 필요한 클래스가 있다면 실행엔진이 클래스로더에게 요청하고 클래스로더가 클래스를 불러온다.
링킹
초기화
클래스 안의 Static 변수를 할당하고 초기화한다.
이때 링킹단계는 또 크게 3가지로 나눌 수 있다.
검증 : 바이트코드가 자바의 규칙을 따르고 있는지 검증하는 단계
준비 : 클래스가 필요로 하는 메모리를 미리 할당하는 단계
분석 : 클래스가 참조하는 객체에 실제 메모리값을 대입하는 단계
캐시 : 이전에 로드되었던 클래스인지 캐시에서 확인한다.
상위 : 상위 클래스로더에서 로드되었던 클래스인지 확인한다.
본인 : 본인, 하위클래스로더에서 클래스를 로드한다.
상위 계층부터 아래와 같이 존재한다.
Bootstrap Class Loader : JVM이 실행되면 맨 처음 실행되는 클래스로더로 자바의 기본적인 클래스를 로드한다.
Extension Class Loader : 기본적인 클래스에서 확장된 클래스들을 로드한다.
System Class Loader : classpath라는 옵션에 주어진 클래스들을 로드한다.
사용자 정의 클래스로더 : 사용자가 직접 정의한 클래스로더이다.