-
jvm 클래스 로더 작동방식자바웹프로그래밍/JAVA 2024. 7. 11. 13:16728x90반응형
JVM의 클래스 로더는 Java 애플리케이션에서 클래스를 메모리로 로드하고, 링크하고, 초기화하는 역할을 합니다. 이를 통해 필요한 클래스들이 적절히 사용될 수 있도록 합니다. 클래스 로더의 작동 방식을 이해하기 위해 다음과 같은 주요 단계와 구성 요소를 살펴보겠습니다
1. 클래스 로더의 유형
JVM에는 세 가지 기본 클래스 로더가 있습니다:
- Bootstrap Class Loader: JVM의 핵심 클래스 로더로, JDK의 rt.jar와 같은 핵심 라이브러리를 로드합니다. 이는 네이티브 코드로 작성되어 있으며, JVM이 시작될 때 로드됩니다.
- Extension Class Loader: 확장 클래스 로더로, JRE의 lib/ext 디렉토리에 있는 클래스들을 로드합니다.
- Application Class Loader: 시스템 클래스 로더로, 애플리케이션의 클래스패스에 지정된 클래스를 로드합니다.
2. 클래스 로더의 작동 방식
클래스 로딩은 다음과 같은 세 단계로 이루어집니다:
- 로딩(Loading): 클래스 파일을 찾고, 이를 읽어들이며, 메모리로 로드합니다.
- 링크(Linking):
- 검증(Verification): 클래스 파일의 형식과 바이트코드의 유효성을 검사합니다.
- 준비(Preparation): 클래스의 정적 필드를 위한 메모리를 할당하고 기본값을 설정합니다.
- 해결(Resolution): 심볼릭 레퍼런스를 실제 메모리 주소로 변환합니다.
- 초기화(Initialization): 클래스의 정적 초기화 블록과 정적 필드를 초기화합니다.
3. 클래스 로더 예제
간단한 예제를 통해 클래스 로더가 어떻게 작동하는지 살펴보겠습니다
Step 1: 클래스 파일 준비
먼저, 두 개의 클래스를 만듭니다: Main과 Example.
// Example.java public class Example { static { System.out.println("Example class loaded"); } public void display() { System.out.println("Hello from Example class"); } }
// Main.java public class Main { public static void main(String[] args) { try { // 사용자 정의 클래스 로더 사용 ClassLoader classLoader = Main.class.getClassLoader(); // Example 클래스 로드 Class<?> exampleClass = classLoader.loadClass("Example"); System.out.println("Example class loaded using: " + classLoader); // Example 클래스 인스턴스 생성 및 메서드 호출 Object exampleInstance = exampleClass.getDeclaredConstructor().newInstance(); exampleClass.getMethod("display").invoke(exampleInstance); } catch (Exception e) { e.printStackTrace(); } } }
Example class loaded using: sun.misc.Launcher$AppClassLoader@18b4aac2 Example class loaded Hello from Example class
4. 사용자 정의 클래스 로더
추가로, 사용자 정의 클래스 로더를 만들어볼 수 있습니다. 예를 들어, 파일 시스템에서 클래스를 직접 읽어오는 클래스 로더를 만들어보겠습니다.
import java.io.*; public class CustomClassLoader extends ClassLoader { @Override protected Class<?> findClass(String name) throws ClassNotFoundException { byte[] classData = loadClassData(name); if (classData == null) { throw new ClassNotFoundException(); } return defineClass(name, classData, 0, classData.length); } private byte[] loadClassData(String name) { try { String fileName = name.replace('.', '/') + ".class"; InputStream is = new FileInputStream(fileName); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int bufferSize = 1024; byte[] buffer = new byte[bufferSize]; int length; while ((length = is.read(buffer)) != -1) { baos.write(buffer, 0, length); } return baos.toByteArray(); } catch (IOException e) { e.printStackTrace(); return null; } } }
이제 Main 클래스를 수정하여 사용자 정의 클래스 로더를 사용해보겠습니다:
public class Main { public static void main(String[] args) { try { // 사용자 정의 클래스 로더 사용 CustomClassLoader customClassLoader = new CustomClassLoader(); // Example 클래스 로드 Class<?> exampleClass = customClassLoader.loadClass("Example"); System.out.println("Example class loaded using: " + customClassLoader); // Example 클래스 인스턴스 생성 및 메서드 호출 Object exampleInstance = exampleClass.getDeclaredConstructor().newInstance(); exampleClass.getMethod("display").invoke(exampleInstance); } catch (Exception e) { e.printStackTrace(); } } }
컴파일하고 실행하면, 사용자 정의 클래스 로더가 Example 클래스를 로드하는 것을 확인할 수 있습니다.
javac Example.java CustomClassLoader.java Main.java java Main Example class loaded using: CustomClassLoader@1540e19d Example class loaded Hello from Example class
728x90반응형'자바웹프로그래밍 > JAVA' 카테고리의 다른 글
org.springframework.core.io.Resource란 무엇인가 !!? (0) 2024.07.15 JVM의 메모리 영역에 대한 이해와 예시와 reflection의 이해 (0) 2024.07.11 java에서의 동시성 이슈 제어방법 (0) 2024.07.10 [JAVA] BufferedReader / BufferedWriter 왜 사용할까? (분석) (0) 2024.02.28 Reader,Writer(문자 기반 스트림) with java (0) 2024.02.27