본문 바로가기
관리자

Programming-[Backend]/Java

[자바 기초] 4. 자바의 동작원리 : JVM, JRE, JDK 구분과 차이점

728x90
반응형

잠시 Gabage Collector(GC)로 길이 샜다. 다시 자바의 동작원리의 큰 부분으로 돌아온다. GC는 좀 구체적인 감이 있지만 언젠가는 공부해야될 주제였다. 재미있었으니 됐다.

 

자바 동작원리를 이해하기 위한 가장 큰 틀로 자바의 바이트코드 - 기계어 - 하드웨어의 동작 방식 등에 대해서 공부했었다. 이제 바이트코드로 변환된 자바의 클래스 파일이 어떻게 메모리에 저장되서 동작되게 되는지 알아본다. 그중 가장 큰 개념인 JVM, JRE, JDK에 대해서 잠시 알고 간다.

 

 


 

1. JVM(Java Virtual Machine)

 

 

JVM은 자바 코드를 실행하기 위한 핵심 동작 모듈이다. 2편에서 JVM의 native memory를 살펴보긴 했다만, 글의 목적에 맞게 좀 더 크게 보자.

 

 

Ref1 - 그림1. JVM 구조

 

JVM 의 역할은 크게 3가지이다.

  1. Class Loader
  2. Runtime Data Area
  3. Execution Engine

 

Class Loader는 자바 바이트코드를 메모리에 올려주는 역할을 한다. 그리고 Runtime Data Area는 1편에서 본 것처럼 실제 자바 바이너리 파일들이 저장되는 공간이다. Execution engine은 파일들을 읽어들여서 프로그램이 실행되는 부분이다. 각 영역의 자세한 내용은 다음 글들에서 자세히 다루도록 한다.

 

다시 말하면 변환된 코드를 메모리에 저장하고, 실행하는 부분이 JVM 이다. 자바의 핵심 모듈이라고 할 수 있겠다.

 

 

 


 

 

2. JRE(Java Runtime Environment)

 

직역하면 자바 실행환경이다. 실행을 하는 환경이라.. 방금 위에서 자바의 실행은 JVM이 도맡아 한다고 했었는데, 이 실행을 하는 환경이 JRE이라고 하니, 아래와 같은 도식이 떠오른다. 

 

Ref2 - 그림2. JVM, JRE, JDK 구성도

 

JVM에 어떤 환경적 요소를 더한 것이 JRE이다. 그림2에서 볼 수 있듯이 Library와 Classes가 더해진 것을 볼 수 있다. 이것들이 뭘까? 다음은 참조3.의 내용을 발췌한 것이다.

 

//Java 코드
public class Main {
  public static void main(String[] args) {
    int a = 1;
    System.out.println(a);
  }
}
//바이트코드
... 중략 ...
  L0
    LINENUMBER 3 L0
    ICONST_1
    ISTORE 1
   L1
    LINENUMBER 4 L1
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ILOAD 1
    INVOKEVIRTUAL java/io/PrintStream.println (I)V
   L2
    LINENUMBER 5 L2
    RETURN
   L3
    LOCALVARIABLE args [Ljava/lang/String; L0 L3 0
    LOCALVARIABLE a I L1 L3 1
    MAXSTACK = 2
    MAXLOCALS = 2
...

 

예시 Java 코드가 바이트코드로 표현됬는데, 여기서 Ljava/io/PrintStream, Ljava/lang/String과 같이 JVM에 로딩될 바이트 코드에서 필수 라이브러리와 Class를 참조하는 것을 확인할 수 있다. 즉 JRE는 java.io, java.util, java.thread등 작동에 필수적인 요소들이라고 할 수 있다.

 

 


 

3. JDK(Java Development Kit)

 

자바 개발 도구. 용어만 봐도 셋 중 가장 큰 단위이며 개발자가 이용할 부분임을 알 수 있다. 이 JDK는 맨 처음 다루었던 그림1. 에서 볼 수 있었던, 소스파일들을 클래스 파일들로 변환해주는 Java Compiler(javac), 코드를 디버깅하는 jdb 등의 기능을 갖는다. 이렇게 구성되어 있어서 개발자는 JDK 설치만으로 자바의 기능을 사용할 수 있는 것이다.

 

 


 

기타

 

참조3)에 좋은 내용이 많아서 부록으로 남겨둔다.

 

 

1. LTS(Long Term Service)

 

프로그램은 버전별로 안정적인 버전과 실험적인? 버전이 번갈아가며 업데이트 된다. 그중에 LTS라는 것은 오랜 기간(일반적으로 5년 이상) 제작사에서 관리 및 지원을 해주는 버전을 의미한다. 자바의 경우 8, 11버전이 LTS 버전이라 최근에는 11버전을 가장 많이 사용하고, 다음 LTS 버전은 17버전으로 예정하고 있다.

 

 

2. open JDK, Oracle JDK

 

자바 개발사는 원래 Sun Microsystems 였으나, Oracle에 인수되었다. 그래서 open JDK와 Oracle JDK 라는 이름으로 구분되는데 open JDK는 오픈 소스이며 상업적 사용이 가능하지만 지원 정도가 낮다. Oracle JDK는 상업적으로 사용 시 비용을 지불해야되고, 지원을 잘해준다.

 

웹 개발 수준에서는 큰 차이가 나지 않는다고해서 많은 사람들이 아직까지는 open JDK를 사용하고 있다고 한다.

 


 

참조

 

1) 위키피디아

https://ko.wikipedia.org/wiki/자바_가상_머신

 

 

2) juyeon park님 블로그

https://pjuyeon25.medium.com/java-jdk-jre-jvm-%EC%B0%A8%EC%9D%B4-b5a60fe4653

 

3) 테코블

https://tecoble.techcourse.co.kr/post/2021-07-12-jvm-jre-jdk/

 

 

 

728x90
반응형