Java

JDK, JRE, JVM

hooneats 2022. 6. 21. 13:40
728x90

 

 

JDK

출처 : https://www.geeksforgeeks.org/differences-jdk-jre-jvm/?ref=lbp

JDK(Java Development Kit )는 Java 애플리케이션을 개발하는 데 사용되는 소프트웨어 개발 환경이다. JDK 는  JRE(Java Runtime Environment), 인터프리터/로더(Java), 컴파일러(javac), 아카이버(jar), 문서 생성기(Javadoc) 및 디버그 등 기타 Java 개발에 필요한 도구가 포함된다. 

 

JDK의 핵심 구성 요소는 간단하게 다음과 같다.

  • JRE
  • 개발 도구

JDK 에 포함되어 있는 요소를 간단하게 몇가지만 살펴보면 다음과 같다.

  • javac – 클래스 및 인터페이스 정의를 읽고 클래스 파일로 컴파일
  • java –  Java 애플리케이션을 시작합니다.
  • javadoc –  Java 소스 파일에서 API 문서의 HTML 페이지 생성
  • appletviewer  – 웹 브라우저 없이 Java 애플릿을 실행할 수 있습니다.
  • jar –  Java 애플릿 또는 애플리케이션을 단일 아카이브로 패키징
  • jdb –  Java 애플리케이션의 버그를 찾고 수정하는 데 사용되는 명령줄 디버깅 도구
  • ...

 

JDK 의 구성요소를 그림으로 보면 다음과 같다.

출처 : https://www.guru99.com/difference-between-jdk-jre-jvm.html#2

  • JDK : JDK를 사용하면 프로그램을 작성할 수 있다.
  • 클래스 라이브러리: Java 프로그램이 런타임에 호출할 수 있는 동적으로 로드 가능한 라이브러리 그룹이다.
  • 컴파일러: .java 파일을 받아 바이트코드를 포함하는 .class 파일로 컴파일하는 Java 프로그램이다. Java에서 기본 컴파일러는 Javac이다.
  • 디버거: 디버거는 개발자가 Java 프로그램을 테스트하고 디버그할 수 있는 Java 프로그램이다.
  • JavaDoc: JavaDoc은 Sun Microsystems에서 Java용으로 만든 문서이다. JavaDoc은 소스 프로그램에서 HTML 파일로 API 문서를 생성하는 데 사용할 수도 있습니다.

 

참고 사이트1 , 참고 사이트2 

 


 

 

JRE

JRE(Java Runtime Environment)는 Java 응용 프로그램을 실행하기 위한 최소 요구 사항을 제공한다. JVM(Java Virtual Machine), 핵심 클래스 Libraries 로 구성 된다

 

JRE의 핵심 구성 요소는 간단하게 다음과 같다.

  • JVM(Java Virtual Machine)
  • 자바 프로그램 실행에 필요한 클래스들
  • 속성 파일들

 

JRE는 다음과 같이 동작한다.

출처 : https://www.guru99.com/difference-between-jdk-jre-jvm.html#2

  1. 클래스 로더: 클래스 로더는 Java 프로그램을 실행하는 데 필요한 다양한 클래스를 로드한다. JVM은 부트스트랩 클래스 로더, 확장 클래스 로더 및 시스템 클래스 로더라는 세 가지 클래스 로더를 사용한다. -> 클래스로더의 참고 :  참고 사이트
  2. 바이트 코드 검증기: 바이트 코드 검증기는 코드가 인터프리터를 방해하지 않도록 바이트 코드를 검증한다.
  3. 인터프리터: 클래스가 로드되고 코드가 확인되면 인터프리터는 코드를 한 줄씩 읽는다.
  4. 런타임: 런타임은 특정 프로그램이 실행되는 기간을 설명하기 위해 프로그래밍에서 주로 사용되는 시스템이다.
  5. 하드웨어: Java 네이티브 코드를 컴파일하면 특정 하드웨어 플랫폼에서 실행된다.

 

참고 사이트1 , 참고 사이트2 , 참고 사이트3


 

 

JVM

JVM(Java Virtual Machine)은 Java 코드 또는 애플리케이션을 구동하기 위한 런타임 환경을 제공하는 엔진이다. Java 바이트 코드를 기계어로 변환한다. JVM은 JRE(Java Run Environment)의 일부이다. 별도로 다운로드하여 설치할 수 없고, JRE를 설치해야 한다.

 

출처 : https://doozi0316.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80?category=935577

 

JVM의 주요 구성 요소는 다음과 같다.

  • ClassLoader Subsystem : 컴파일 시간이 아닌 런타임에 처음으로 클래스를 참조할 때 클래스 파일을 로드, 링크 및 초기화한다. 동적 클래스 로딩이라고도 한다.
  • 런타임 데이터 영역 : 메서드 영역, 힙 영역, 스택 영역, 기본 메서드 스택 및 PC 레지스터를 포함한다.
  • 실행 엔진: 바이트 코드는 실행 엔진에 의해 실행됩니다. 실행 엔진은 바이트 코드를 읽고 조각별로 실행합니다. 인터프리터, 컴파일러 및 가비지 수집 영역을 포함한다.

 

JVM 은 다음과 같은 동작을 한다.

 

출처 : https://www.guru99.com/difference-between-jdk-jre-jvm.html#2

 

1) 클래스 로더

클래스 로더는 클래스 파일을 로드하는 데 사용되는 하위 시스템이다. 그것은 세 가지 주요 기능을 수행한다. -> Loading , Linking , Initialization  클래스로더 주요기능 참고 : 참고 사이트

2) method 영역(참고 글 : 참고 사이트)

JVM 메소드 영역은 메타데이터, 자바 메소드용 코드, 상수 런타임 풀과 같은 클래스 구조를 저장한다.

3) 힙 (가비지컬렉터의 관리를 받는다. 참고 글 : 참고 사이트)

모든 개체, 배열 및 인스턴스 변수는 힙에 저장된다. 이 메모리는 여러 스레드에서 공유된다.

4) JVM 언어 스택

Java 언어 스택은 지역 변수와 부분 결과를 저장한다. 모든 스레드에는 스레드가 생성될 때 동시에 생성되는 자체 JVM 언어 스택이 있다. 메서드가 호출되면 새 프레임이 생성되고 메서드 호출 프로세스가 완료되면 프레임이 제거된다.

5) PC 레지스터

PC 레지스터는 현재 실행 중인 자바 가상 머신 명령어의 주소를 저장한다. Java에서 각 스레드에는 별도의 PC 레지스터가 있다.

6) 네이티브 메소드 스택

네이티브 메서드 스택은 네이티브 라이브러리에 따라 네이티브 코드의 명령을 보유한다. 기본 힙에 메모리를 할당하거나 모든 유형의 스택을 사용한다.

7) 실행 엔진

클래스를 실행시키는 역할을 한다. 클래스 로더가 JVM내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 이것은 실행 엔진에 의해 실행된다. 자바 바이트 코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경한다. 실행 엔진은 3가지를 포함한다. -> 인터프리터 , JIT(Just-In-Time) , 가비지 콜렉터(참고 사이트)

8) 네이티브 메소드 인터페이스

Native Method Interface는 프로그래밍 프레임워크이다. JVM에서 실행 중인 Java 코드가 라이브러리 및 기본 애플리케이션에서 호출할 수 있도록 한다.

9) 네이티브 메소드 라이브러리

네이티브 라이브러리는 실행 엔진에 필요한 네이티브 라이브러리(C, C++)의 모음이다.

 


HostSpot JVM

출처 : https://www.javacodegeeks.com/2011/07/jvm-options-client-vs-server.html

 

JDK1.3 부터 공식적으로 자바에서 HotSpot JVM 이 제공되었다. 자바에서는 위의 그림같이 'HotSpot 클라이언트 컴파일러' 와 'HotSpot 서버 컴파일러' 의 두 가지 컴파일러를 제공한다.

'HotSpot 클라이언트 컴파일러' 는 CPU 코어가 하나뿐인 사용자를 위해 만들어진 컴파일러다. 이 컴파일러의 주요 특증인 프로그램의 시작 시간을 빠르게 하고, 적은 메모리를 점유하도록 하는 것이다. 

'HotSpot 서버 컴파일러' 는 코어가 많은 장비에서 프로그램을 돌리기 위해 만들어진 컴파일러다. 이 컴파일러는 프로그램 수행 속도에 초점이 맞추어져 있다. 

HotSpot 이라 이름 붙인 이유는 JDK1.3 이전에 나왔던 가상 머신과 구분하기 위한 이름이라고 생각하면 된다.

기본적으로 자바가 시작할 때 다음 두가지를 보고 클라이언트 장비인지 서버 장비인지 확인한다.

  • 2개 이상의 물리적 프로세서
  • 2GB 이상의 물리적 메모리

이 조건을 만족하면 Oracle 에서 만든 JVM 은 서버 컴파일러를 선택한다.

 

추가적으로 실행시 다음의 옵션으로 'client' 와 'server' 를 선택할 수 있다.

java -client
java -server

 

 

 

 

참고 사이트1 , 참고 사이트2 , 참고 사이트3 , 참고 사이트4 , 참고 사이트5

추가적인 사이트1

추가적인 사이트2 

참고 도서 - 자바의 신

728x90