Backend/JAVA

JAVA / JVM / JDK / JRE에 대해서

keepbang 2021. 5. 4. 18:47

JDK, JRE, JVM 구조


JVM (Java Virtual Machine)


  • 자바 가상 머신으로 자바 바이트코드(.class 파일)를 os에 특화된 코드로 변환(인터프리터와 JIT컴파일러)하여 실행한다.
  • 바이트 코드를 실행하는 표준(JVM 자체는 표준)이자 구현체다.(특정 밴더가 구현한 JVM)
  • JVM 밴더: 오라클, 아마존, Azul... etc..
  • 어느 환경에서든 자바 코드를 실행 할 수 있다.
  • 메모리 관리, Garbage Collection(GC)등 많은 고급 기술을 사용하여 Java 애플리케이션에 최적의 성능을 제공


자바프로그램 실행과정

  1. 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받음, JVM은 이 할당받은 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
  2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트 코드(.class)로 변환시킨다.
  3. Class Loader를 통해 class파일들을 JVM으로 로딩한다.
  4. 로딩된 class파일들은 Execution engine을 통해 해석된다.
  5. 해석된 바이트 코드는 Runtime Data Areas에 배치되어 실직적인 수행이 이루어지게 된다.
    이러한 실행과정 속에서 JVM은 필요에 따라 Thread Synchronization과 GC같은 관리작업을 수행한다.

JVM 구성

  • 클래스 로더(Class Loader)
    • JVM내로 클래스(.class파일)를 로드하고 메모리에 저장
    • 로딩(Loading) : 클래스를 읽어오는 과정
    • 링크(Linking) : 레퍼런스를 연결하는과정
    • 초기화(Initialization) : static값들 초기화 및 변수에 할당
  • 메모리(Runtime Data Area)
    • 프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간
    • 힙(Heap) 영역 : 객체를 저장, 공유자원이다.
    • 스택 영역 : 프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역이다.
    • 네이티브 메소드 스택 : 자바 프로그램이 컴파일 되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다.
      • 이부분을통해 C code를 실행시켜 Kernel에 접근할 수 있다.
    • PC(Program Counter) 레지스터 : 쓰레드가 어떤 부분을 어떤 명령으로 실행해야할지에 대한 기록을 하는 부분
    • Method Area : 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간.
  • 실행 엔진(Execution Engine)
    • 클래스를 실행시키는 역할
    • 인터프리터(Interpreter) : 바이트 코드를 명령어 단위로(한줄씩)실행
    • JIT 컴파일러 : 인터프리터 효율을 높이기 위해 사용, 인터프리터가 반복되는 코드를 발견하면 JIT컴파일러로 반복되는 코드를 모두 네이티브 코드로 바꿔둔다. 그 다음부터 인터프리터는 네이티브 코드로 컴파일된 코드를 바로 사용한다.
    • GC(Garbage Collector) : 더이상 참조되지 않는 객체를 모아서 정리한다.

JRE (Java Runtime Environment) : JVM + 라이브러리


  • 자바 애플리케이션을 실행할 수 있도록 구성된 배포판
  • 자바 애플리케이션을 실행하려면 시스템에 JRE가 설치되어 있어야함
  • JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스파일을 가지고 있다.
  • 개발 관련 도구는 JDK에서 제공

JDK(Java Development Kit) : JRE + 개발 툴


  • JRE + 개발 툴
  • 소스 코드를 작성할 때 사용하는 자바 언어는 플랫폼에 독립적.
  • 오라클은 자바 11부터 JDK만 제공하며 JRE를 따로 제공하지 않는다.

자바


  • 프로그래밍 언어
  • JDK에 들어있는 자바 컴파일러(javac)를 사용하여 바이트코드(.class 파일)로 컴파일 할 수 있다.
  • 자바 유료화는 오라클에서 만든 Oracle JDK 11버전부터 상용으로 사용할 때 유료이다.
  • openJDK, amazon Corretto.... <- 무료!!

참고 : https://howtodoinjava.com/java/basics/jdk-jre-jvm/
출처 : https://asfirstalways.tistory.com/158