JVM & JRE & JDK

.·2022년 7월 28일
0

Computer Science

목록 보기
46/81
post-thumbnail

Java Virtual Machine (JVM)

개념

  1. specification: 자바 바이트코드가 실행될 수 있는 런타임 환경을 제공해주는 명세
    • Oracle 등의 회사에서 구현체(JRE)를 제공해준다.
    • implementation provider가 알고리즘을 선택하지는 않는다.
  2. implementation: JVM의 구현체는 JRE
  3. Runtime Instance
    • 자바 클래스를 실행시키기 위해 명령어 프롬프트에 자바 명령어를 작성할 때마다 JVM 인스턴스가 생성된다.

특징

  • abstract machine = 물리적으로 존재하지 않는 가상 머신
  • 다른 언어로 작성되고 자바 바이트코드로 컴파일되는 프로그램들도 실행시킬 수 있다.
  • 많은 하드웨어와 소프트웨어 플랫폼에서 사용 가능하다.
  • 각 OS의 설정이 서로 다르기 때문에 JVM, JRE, JDK는 플랫폼에 의존적이다. (Java는 플랫폼에 의존적이지 않다.)
    • 단 컴파일된 바이너리 코드는 어떤 JVM에서도 동작시킬 수 있다.

작업

  1. 코드를 로드한다.
  2. 코드를 검증한다.
  3. 코드를 실행한다.
  4. 실행 환경(runtime environment)의 규격을 제공한다.
    • 필요한 라이브러리 및 기타파일
  5. 메모리 영역, 클래스 파일 포맷, 레지스터 셋, 가비지 콜렉트된 heap, 치명적인 에러 리포트 등의 개념을 제공한다.

구조

  1. Classloader
    클래스 파일들을 로드하는 JVM의 서브시스템

    1. Bootstrap ClassLoader
      • 첫번째 클래스로더
      • Extension ClassLoader의 수퍼 클래스
      • Java Standard Edition의 모든 클래스 파일들을 포함하는 rt.jar 파일 로드
        • java.lang, java.net, java.util, java.io, java.sql 등
    2. Extension ClassLoader
      • Bootstrap의 자식 클래스이자 System 클래스로더의 부모 클래스
      • $JAVA_HOME/jre/lib/ext 디렉토리 내의 jar 파일 로드
    3. System/Application ClassLoader
      • Extension 클래스로더의 자식 클래스
      • classpath의 클래스파일들을 로드
      • classpath = current directory (default)
        • “-cp”나 “-classpath”로 클래스패스를 바꿀 수 있음
  2. Class(Method) Area
    런타임 상수 풀, 필드와 메서드 데이터, 메서드의 코드 같은 각 클래스의 구조를 저장한다.

  3. Heap
    런타임에 객체들이 할당되는 데이터 공간

  4. Stack

    • 프레임 저장
    • 지역 변수, 중간 결과, 메서드 호출과 반환
    • 메서드가 호출될 때마다 새로운 프레임이 생성되고, 메서드가 끝나면 프레임은 소멸된다.
  5. Program Counter(PC) Register
    지금 현재 실행되고 있는 명령어의 주소 저장

  6. Native Method Stack
    어플리케이션에서 사용되는 모든 native method를 가짐

  7. Execution Engine

    1. Virtual processor
    2. Interpreter
      • 바이트코드 스트림을 읽고 명령어들을 실행한다.
    3. Just-In-Time(JIT) compiler
      • 성능 향상을 위해 사용
      • 동시에 비슷한 기능을 가지는 바이트 코드의 일부분을 컴파일해서 컴파일에 필요한 시간을 줄인다.
      • compiler: JVM 명령어 셋 → 특정 CPU의 명령어 셋으로 바꾸는 작업
  8. Java Native Interface (JNI)

    • C, C++, 어셈블리어 등 다른 언어로 적인 다른 어플리케이션과 커뮤니테이션할 수 있는 인터페이스를 제공하는 프레임워크
    • 자바는 JNI를 콘솔 출력이나 OS 라이브러리와 소통할 때 사용한다.

자바 프로그램 실행과정

  1. 프로그램이 실행되면 JVM은 OS로부터 필요로 하는 메모리(Runtime Data Area: Method, Heap, Stack, PC Register, Native Method Stack)를 할당받는다. 용도에 따라 여러 영역으로 나누어 관리한다.
  2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들여서 자바 바이트코드(.class)로 변환시킨다.
  3. Class Loader가 .class 파일들을 JVM에 로딩한다.
  4. 로딩된 .class 파일들은 Execution Engine을 통해 바이너리 코드로 해석된다.
    4-1. Interpreter: 바이트 코드를 명령어 단위로 읽어서 실핸한다. 한 줄씩 수행하기 때문에 느리다.
    4-2. JIT Compiler: 인터프리팅하다가 적절한 시점에 바이트코드 전체를 컴파일해서 네이티브 코드로 변경, 캐시에 저장하고 이후 네이티브 코드로 직접 실행한다. 인터프리팅보다 훨씬 오래 걸리므로 해당 메서드가 얼마나 자주 수행되는지 확인하고 일정 횟수를 넘을 때만 컴파일한다.
  5. 해석된 바이트 코드는 Runtime Data Area에 배치되어 실질적인 수행이 이루어진다.
    5-1. 필요에 따라 JVM은 Thread Synchronization과 같은 GC 작업을 수행한다.

Java Runtime Environment (JRE)

자바 어플리케이션을 개발하는데 필요한 소프트웨어 툴의 모음

특징

  • 런타임 환경 제공
    • JVM이 런타임에 사용하는 라이브러리와 다른 파일들의 모음을 가진다.
  • JVM의 구현체 → 물리적으로 존재한다.
  • Sun Micro Systems와 같은 회사들이 JVM의 구현체를 활발하게 릴리즈하고 있다.

Java Development Kit (JDK)

자바 어플리케이션과 애플릿(applet, 다른 프로그램 내에서 실행되는 프로그램)을 개발하는데 사용되는 소프트웨어 개발 환경

개념

  • JDK = JRE + development tools
  • Oracle에서 제공하는 아래 Java 플랫폼들 중 하나를 구현한 것
    1. Standard Edition Java Platform
    2. Enterprise Edition Java Platform
    3. Micro Edition Java Platform

특징

  • 물리적으로 존재한다.
  • 개별 JVM와 자바 어플리케이션 개발을 하기 위한 또다른 리소스(java, javac, jar, Javadoc 등)을 포함한다.

컴포넌트

  • java: 자바 어플리케이션 로더(loader)
    • interpreter: javac 컴파일러에 의해 만들어지는 클래스 파일들을 해석한다.
    • 개발과 배포에 사용되는 하나의 런처(launcher)이다.
      • 더이상 JRE가 배포 런처로 같이 사용되지 않는다.
  • javac: 자바 컴파일러
    • 소스 코드를 자바 바이트코드로 변환
  • jar: archiver
    • 관련 클래스 라이브러리들을 하나의 JAR 파일로 패키징
    • JAR 파일 관리
  • javadoc: 문서 생성기(documentation generator)
    • 소스 코드의 코멘트로부터 자동으로 문서를 생성한다.
  • 등..

출처

0개의 댓글