[Java] JVM 은 어떻게 동작하나요?

orca·2023년 11월 19일

CS

목록 보기
7/46

JVM은 Java 바이트 코드를 실행하는 가상 머신입니다. Java 프로그램은 Java 컴파일러를 통해 Java 바이트 코드로 변환되어 JVM으로 전달됩니다. 바이트 코드는 클래스 로더를 통해 런타임 데이터 영역에 적재됩니다. 이후 JIT 컴파일러와 인터프리터에 의해 JVM이 실행할 수 있는 기계어로 변환되는 과정을 거칩니다.

Java 프로그램 동작 원리

1. JAVAC

  • java 컴파일러가 .java 파일을 java 바이트 코드 .class 파일로 변환

2. Class Loader

  • 클래스 로더가 java 바이트 코드를 런타임 데이터 영역에 로드함
    • 동적 로드 : 런타임에 클래스를 처음으로 참조할 때 클래스 로드
    • 클래스 로더 위임 모델
      • 가시성 원칙 : 하위 클래스 로더는 상위 클래스 로더를 알 수 있지만, 상위 클래스 로더는 하위 클래스 로더를 알 수 없음

      • 고유성 원칙 : 하위 클래스 로더는 상위 클래스 로더가 로딩한 클래스를 재로딩하지 않음

      • 위임 원칙 : 하위 클래스 로더는 상위 클래스 로더로 로딩 요청을 위임

3. 런타임 데이터 영역

  • JVM이 할당받는 메모리 영역
  • 스레드 별 영역
    • JVM 스택 : 일반적인 메서드를 위한 스택 영역
    • Native Method 스택 : 네이티브 메서드(ex>c++)를 위한 스택 영역
    • PC 및 레지스터 집합
  • 공유 영역
    • 힙 : 객체를 저장하는 공간, 가비지 컬렉션의 대상
    • 메서드 영역 : 객체 생성을 위한 필요 정보 적재
    • 런타임 상수 풀 : JVM은 어떤 메서드나 필드를 참조할 때 런타임 상수 풀을 통해 해당 메서드나 필드의 실제 메모리상 주소를 찾아서 참조

4. Interpreter 와 JIT Compiler

  • 바이트 코드는 다시 JVM이 실행할 수 있는 형태로 변환되어 실행됨
  • 인터프리터
    • 인터프리터는 바이트 코드를 필요할때마다 라인 바이 라인으로 실행 ➡️ 느림
  • JIT(JustInTime) 컴파일러
    • JIT 컴파일러가 반복되는 프로그램 블록을 기계어 코드로 변환해 캐싱함
  • 인터프리터와 JIT 컴파일러를 활용해 성능 개선

JVM Internal
JIT Java | Just In Time (JIT) Compiler

0개의 댓글