본문 바로가기
Java/basic

JVM 이란?

by Ellery 2022. 10. 30.

JVM은 자바 가상머신이다.. JRE는 Java api와 JVM으로 구성되어 있고, 여기서 JVM은 자바 애플리케이션을 Class loader를 통해 읽어 자바 API와 함께 실행한다.
자바 바이트코드(.class 파일)를 각 OS별로 특화된 코드로 변환(인터프리터, JIT 컴파일러에서 수행함)하여 네이티브OS에 맞게 머신코드로 변환한 뒤 실행한다. 따라서 JVM은 특정 플랫폼에 종속적이라 할 수 있다. (각 OS별로 다른 JVM 버전이 존재함)

간략한 자바코드 실행순서: 자바코드 → 자바 컴파일러 → 바이트코드 → 인터프리터 or JIT컴파일러 → 바이너리코드

기술적인 정의로서의 JVM은 자바 코드를 실행하고 해당 코드에 대해 런타임 환경을 제공하는 소프트웨어 프로그램에 대한 사양이다. (다양한 버전의 JVM이 존재함). 따라서 JVM 명세를 따르는 다양한 JVM이 있을 수 있다. (예외적으로 안드로이드의 Dalvik VM은 JVM인데 JVM 명세를 따르지 않는다. JVM 명세인 스택 기반이 아니라 하드웨어와 같은 레지스터 기반의 명령어 코드로 변환됨)
최초에 JVM은 자바만을 지원하기 위해 만들었지만, 클래스파일만 있으면 JVM으로 실행할 수 있기 때문에 다른 언어로 코딩을 했어도 컴파일시 .class 파일을 만들어주거나 java파일을 생성해주는 언어라면 실행이 가능하다. 따라서 JVM 기반의 다른 언어들도 지원한다. (kotlin, scala 등이 있음)

java파일을 컴파일(javac xxx.java) 하면 바이트코드(.class 파일)이 생성되고, 이 바이트코드는 JDK에 내장되있는 javap 역어셈블러를 이용해서 읽을 수 있다. (javap -c xxx)

JVM은 시스템 메모리를 관리하면서 자바 기반의 어플리케이션을 실행시킬 수 있는 이식 가능한 실행환경을 제공한다.

바이트 코드를 실행하는 표준(JVM 표준 스펙이 있음)이면서 구현체(특정 벤더가 구현한 JVM는 다양함)이다. 여러 벤더에서 만든 JVM이 있다. OracleJDK, correto, openJDK...(스펙은 https://docs.oracle.com/javase/specs/)

~/javaTest  javap -c Hello                                    ok  10:12:22 PM
Compiled from "Hello.java"
class Hello {
  Hello();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #13                 // String hello java
       5: invokevirtual #15                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}

Hello.java 파일을 선언한 뒤 클래스 내 메인메소드에 println("hello")를 작성한뒤 컴파일하는 코드이다.
그 뒤 javap -c hello 커맨드를 입력했을 때 이런 식으로 해석을 해서 OP code(명령코드. 기계어의 일부)를 보여준다.
이 OP code 하나하나가 일종의 명령어이고 1바이트이다. 1바이트니까 2^8 = 256개의 명령어를 만들 수 있을 것이고 실제로는 200개 정도가 정의되어 있다.

- 백기선님의 자바 온라인 스터디 https://github.com/whiteship/live-study 주제를 정리한 내용입니다.

참고
- 자바의 정석 2판
- https://www.javatpoint.com/jvm-java-virtual-machine
- https://d2.naver.com/helloworld/1230