1주차 : JVM은 무엇이며 자바 코드는 어떻게 실행되는가?

JAVA 프로그램


컴파일 방법

  • IDE 사용
    • IDE의 문법 검사 그 자체가 컴파일이라고 볼 수 있음
    • 잘못된 코드 작성 -> 컴파일 에러
  • 커맨드에서 javac 명령어 사용
    1. 커맨드 창에서 .java 파일이 있는 디렉터리로 이동
    2. javac (.java 파일명)
    • 결과로 .class 파일 (바이트코드) 만들어짐
  • 커맨드에서 컴파일 할 시 다양한 컴파일 옵션을 사용할 수 있음

바이트코드

고급 언어(자바, 코틀린 등)와 기계어의 중간 언어

  • 1 byte 크기의 명령어 -> 최대 255개의 명령어를 쓸 수 있음
  • JVM만 있으면 OS에 상관없이 실행할 수 있음 -> OS 독립적
  • 어떤 프로그래밍 언어로 작성하든 바이트코드로 컴파일만 할 수 있으면 JVM을 통해 실행 할 수 있음
    • WORA (Write Once Run Anywhere)
      : 한번 작성해서 바이트코드로 컴파일하여 배포하면 어디서든지 실행할 수 있다.

실행 방법

  • IDE 사용 - 빌드, 컴파일, 실행 한번에 할 수 있음
  • 커맨드에서 java 명령어 사용
    1. 커맨드에서 .class 파일이 있는 디렉터리로 이동
    2. java (.class 파일명) -> 자바 프로그램 실행

JVM (Java Virtual Machine)


JVM이란?

바이트코드를 (플랫폼에 맞는 기계어로) 컴파일하여 실행시켜주는 가상 머신

  • JVM은 플랫폼에 의존적임
    • 플랫폼 : OS + CPU 아키텍처

JVM 구성 요소

Class Loader System

런타임 시 바이트코드(.class) 파일을 JVM 내 Runtime Data Areas(memory)에 배치하는 시스템

  • 작동 과정
  1. 로딩
    • 클래스 파일을 JVM 메모리에 로드
  2. 링크
    1. 검증
      • 클래스 파일이 자바 및 JVM 명세에 명시된 대로 작성되었는지 검증
    2. 준비
    3. 분석
  3. 초기화
    • static 변수를 초기화
  • 계층 구조
  1. BootStrap class loader
    • 핵심 자바 API를 로드 (ex. Object Class)
    • native code로 구성
      * native code : CPU나 OS가 직접 실행할 수 있는 코드
  2. Extension class loader
    • 기본 API를 제외한 확장 클래스들을 로드함
  3. System class loader
    • 애플리케이션의 클래스들을 로드함

Runtime Data Areas (Memory)

자바 프로그램을 실행하기 위해 OS로부터 할당받은 메모리 공간

  • 구성
  1. Stack
  2. Heap
  3. Method (Class)
  4. PC registers
  5. Native Method Stack

Execution Engine

바이트코드를 명령어 단위로 읽어서 실행하는 기능

Java Native Method Interface(JNI)

C, C++, 어셈블리어로 작성된 Native 키워드를 사용하는 메소드를 사용할 수 있도록 해주는 인터페이스

JIT 컴파일러

런타임 시 반복적으로 사용되는 코드(바이트코드)를 컴파일 해주는 것

  • 반복적인 코드를 미리 컴파일하여 캐싱함으로써 실행 속도를 향상시킴
  • 인터프리터의 한 줄씩 읽어서 실행하는 느린 속도를 보완

출처: https://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/

JRE vs JDK


JRE

JVM + 자바 라이브러리

JDK

JRE + 개발 도구

  • 현재는 구분이 없어짐

좋은 웹페이지 즐겨찾기