Class는 어떻게 메모리에 로드될까?
Class Loading
클래스 로더는 클래스가 처음 참조될 때 JVM의 메모리에 로딩한다.
- 로드(Load)
- JVM이 클래스 파일을 메모리로 가져오는 과정.
- 클래스 로더가 런타임에 바이트 코드 파일(.class 파일)을 찾아서 JVM의 메모리로 로드한다.
- 클래스 로더는 부트스트랩 클래스 로더, 확장 클래스 로더, 애플리케이션 클래스 로더로 나뉜다.
- JVM이 클래스 파일을 메모리로 가져오는 과정.
- 링크(Link)
- 로드된 클래스 파일들을 검증하고, 준비하며, 클래스 간의 상호 작용을 가능하게 하는 단계.
- 검증(Verify): 클래스 파일의 형식이 올바른지, 안전한 코드인지 검사한다.
- 준비(Prepare): 클래스 또는 인터페이스에 필요한 메모리를 할당하고, 정적 필드를 기본값으로 초기화한다.
- 해석(Resolve): 심볼릭 메모리 참조를 직접 참조로 변환한다. 클래스 참조가 실제 메모리 위치를 가리키도록 한다.
- 로드된 클래스 파일들을 검증하고, 준비하며, 클래스 간의 상호 작용을 가능하게 하는 단계.
- 초기화(Initialize)
- 클래스 변수의 적절한 초기값으로 초기화하는 단계. 클래스가 처음 사용될 때 한 번만 수행된다1.
- 정적 변수들이 정의된 순서대로 초기화되고, 정적 블록이 실행된다2.
- 클래스 변수의 적절한 초기값으로 초기화하는 단계. 클래스가 처음 사용될 때 한 번만 수행된다1.
1클래스가 참조되기만 하고 정적 변수에 접근하거나 인스턴스를 생성하는 등 사용되지 않으면 초기화 단계는 진행되지 않을 수 있다.
2정적 변수가 먼저 초기화되고, 정적 블록이 실행된다. 마찬가지로 인스턴스 변수가 먼저 초기화되고, 인스턴스 블록이 실행된다. 생성자는 마지막으로 실행된다.