ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • jvm 클래스 로더 작동방식
    자바웹프로그래밍/JAVA 2024. 7. 11. 13:16
    728x90
    반응형

     

     

     

    JVM의 클래스 로더는 Java 애플리케이션에서 클래스를 메모리로 로드하고, 링크하고, 초기화하는 역할을 합니다. 이를 통해 필요한 클래스들이 적절히 사용될 수 있도록 합니다. 클래스 로더의 작동 방식을 이해하기 위해 다음과 같은 주요 단계와 구성 요소를 살펴보겠습니다

     

    1. 클래스 로더의 유형

    JVM에는 세 가지 기본 클래스 로더가 있습니다:

    1. Bootstrap Class Loader: JVM의 핵심 클래스 로더로, JDK의 rt.jar와 같은 핵심 라이브러리를 로드합니다. 이는 네이티브 코드로 작성되어 있으며, JVM이 시작될 때 로드됩니다.
    2. Extension Class Loader: 확장 클래스 로더로, JRE의 lib/ext 디렉토리에 있는 클래스들을 로드합니다.
    3. Application Class Loader: 시스템 클래스 로더로, 애플리케이션의 클래스패스에 지정된 클래스를 로드합니다.

     

    2. 클래스 로더의 작동 방식

    클래스 로딩은 다음과 같은 세 단계로 이루어집니다:

    1. 로딩(Loading): 클래스 파일을 찾고, 이를 읽어들이며, 메모리로 로드합니다.
    2. 링크(Linking):
      • 검증(Verification): 클래스 파일의 형식과 바이트코드의 유효성을 검사합니다.
      • 준비(Preparation): 클래스의 정적 필드를 위한 메모리를 할당하고 기본값을 설정합니다.
      • 해결(Resolution): 심볼릭 레퍼런스를 실제 메모리 주소로 변환합니다.
    3. 초기화(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
    반응형
Designed by Tistory.