[JAVA]JVM이란?(1)-Class Loader

bbbbbhyun·2025년 1월 29일
0

JAVA

목록 보기
2/5

JVM이란?

  • Java Virtual Machine의 약자로, 자바 가상머신
  • 운영체제에 독립적인 환경에서 바이트코드를 실행
  • 즉, JVM은 자바 애플리케이션을 실행하는 역할을 담당하며, 바이트코드를 OS가 이해할 수 있는 기계어로 변환하는 인터프리터 및 실행 엔진을 포함

JVM의 특징

  1. 바이트코드 실행
    • 자바 컴파일러(javac)가 변환한 바이트코드를 해석하고 실행
  2. 메모리 관리 및 GC (Garbage Collection)
    • 객체를 할당하고 불필요한 객체를 자동으로 제거
  3. 플랫폼 독립성 제공
    • "Write Once, Run Anywhere" (한 번 작성하면 어디서든 실행 가능) 원칙을 지원
  4. 스레드 및 동시성 관리
    • 자바 애플리케이션의 멀티스레드 실행을 지원

JVM 구조

  • 크게 4가지로 분류
  • Class Loader, Runtime Data Area, Execution Engine, Native Interface

Class Loader(클래스 로더)

  1. JVM이 바이트코드를 메모리인 Runtime Data Area에 로드하는 역할
  2. Bootstrap ClassLoader → Extension ClassLoader(플랫폼) → Application ClassLoader → Custom ClassLoader 순으로 계층적으로 동작
  • Bootstrap ClassLoader

    • 최상위 클래스 로더로, JVM이 기본적으로 제공하는 클래스들을 로드
    • rt.jar 또는 java.base 모듈(자바 표준 라이브러리)을 메모리에 로드
    • ex: java.lang.String, java.util., java.io.
    • 네이티브 코드(C/C++)로 작성되어 있으며, 자바 코드로 직접 제어 불가
  • Extension ClassLoader

    • JDK 8까지 존재했던 클래스로, lib/ext/ 디렉토리에 있는 확장 클래스(Extension API)를 로드
    • ex: javax.crypto., javax.sound.
    • JDK 9 이후부터는 모듈 시스템(JPMS)로 대체
  • Application ClassLoader

    • classpath에 지정된 사용자 클래스 및 애플리케이션 클래스를 로드
    • Main 메서드가 포함된 클래스를 실행하는 역할
    • ex: com.example.MyClass
  • Custom ClassLoader

    • 기본 클래스 로더 외에, 개발자가 직접 만든 클래스 로더
    • 네트워크에서 클래스를 로드하거나, 암호화된 .class 파일을 로드할 때 사용
    • ex: URLClassLoader, SecureClassLoader
  1. 클래스 로딩 과정 : 로딩(Loading) -> 링크(Linking) -> 초기화(Initialization)
  • 로딩(Loading)

    • .class 파일(바이트코드)을 읽어와 메모리에 저장(메타데이터 등록)
    • 이 과정에서 클래스 로더는 부모 로더에게 먼저 클래스를 로드할 기회를 주는 부모 위임 모델(Delegation Model)을 사용
    • JVM 내부의 Method Area에 클래스 정보가 저장
  • 링킹(Linking)
    클래스를 사용할 수 있도록 필요한 작업을 수행하는 과정이며, 다음 3가지 단계로 구성

    ① 검증(Verification)

    • .class 파일이 올바른 형식인지 검증

    • 바이트코드 검증 및 보안 검사 수행 (잘못된 코드 실행 방지)

      ② 준비(Preparation)

    • 클래스 변수(static 변수)들을 위한 메모리를 할당하고 기본값으로 초기화

    • ex: static int x = 10; → 초기에는 0으로 설정됨

      ③ 해석(Resolution)

    • 참조(Reference) 변수를 실제 메모리 주소로 변환하는 과정

    • 클래스 내부의 다른 클래스, 메서드, 인터페이스 등의 심볼릭 리퍼런스를 실제 메모리상의 주소로 변경

  • 초기화(Initialization)

    • 클래스의 static 변수들을 정의한 값으로 초기화하고, static 블록을 실행
    • 이 단계에서 클래스가 실제로 사용
    • ex: static int x = 10; → 이제 10으로 초기화

참고

https://backendcode.tistory.com/161
https://steady-coding.tistory.com/305
https://inpa.tistory.com/entry/JAVA-☕-JVM-내부-구조-메모리-영역-심화편#
https://hstory0208.tistory.com/entry/Java-JVM-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0-%ED%8C%8C%ED%97%A4%EC%B3%90-%EB%B3%B4%EA%B8%B0-Static-Stack-Heap
https://s-y-130.tistory.com/111#Minor%--GC%EC%--%--%--Major%--GC%C-%A-%EC%-D%--%--%EB%-F%--%EC%-E%--%--%EB%B-%A-%EC%-B%-D

profile
BackEnd develope

0개의 댓글

관련 채용 정보