백기선님의 더 자바, 코드를 조작하는 다양한 방법을 수강한 후 정리해보았습니다.
저번 시간에 간단하게 정리해본 JVM 아키텍처에서 클래스 로더를 좀 더 자세히 알아보겠습니다.
여러 개의 클래스 로더들이 부모 자식 관계를 맺고 로딩을 합니다.
클래스 로더가 .class 파일을 읽고 적절한 바이너리 파일을 만들어서 '메소드' 영역에 클래스 정보를 저장합니다.
이 클래스 정보는(메소드 영역에 저장하는 데이터) 다음과 같습니다.
로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 '힙' 영역에 저장합니다.
여러개의 클래스 로더가 있습니다.
- 부트 스트랩 클래스 로더 : JAVA_HOME\lib에 있는 코어 자바 API를 제공하며, 최상위 우선순위를 가진 클래스 로더입니다.
- 플랫폼 클래스 로더 : JAVA_HOME\lib\ext 폴더 또는 java.ext.dirs 시스템 변수에 해당하는 위치에 있는 클래스를 읽습니다.
- 애플리케이션 클래스 로더 : 애플리케이션 클래스패스(애플리케이션을 실행할 때 주는 classpath 옵션 또는 java.class.path 환경 변수의 값에 해당하는 위치)에서 클래스를 읽습니다.
코드로 클래스 로더를 확인해보자면, 클래스 로더는 계층형 구조입니다.
public class App {
public static void main(String[] args) {
ClassLoader classLoader = App.class.getClassLoader();
System.out.println(classLoader);
System.out.println(classLoader.getParent());
}
}
현재 App이라는 class의 클래스 로더는 AppClassLoader(애플리케이션 클래스로더)입니다. 애플리케이션 클래스 로더의 부모 로더는 플랫폼 클래스 로더입니다.
즉, 저희가 작성한 코드들의 대부분은 애플리케이션 클래스 로더가 읽습니다. 만약 부모 클래스 로더가 못읽고 애플리케이션 클래스 로더 본인도 못읽는다면, 코드는 class not found Error
가 발생하게되는 것입니다.
JVM에서 가장 중요한 것은 바로 바이트코드입니다. 다음은 바이트코드에 대해 정리해보겠습니다.