Java Virtual Machine: 가상화는 무엇일까


JVM 문서를 읽으면서 정리하는 글. Virtual Machine이라는 단어가 조금은 생소할 지 몰라도, 글을 읽음으로써 개념을 이해하는 데에 목적을 둔다. Java 프로그램이 실행되는 가상 머신이라는 무대는 무엇일까? 왜 가상화를 해야 했을까? 라는 질문을 스스로 던지면서 읽으면 더 도움이 되겠다!

Virtualization?

가상화란 무엇일까? 라고 생각해 보면, 존재하지 없는 무언가를 만들어내는 느낌이다. 실제로 하드웨어 플랫폼, OS 등을 가상으로 만들어 그 위에서 어플리케이션이나 다른 OS와 같은 레이어를 얹을 수 있도록 한 것이다. 그 중에서도 하드웨어 가상화에서는 하나의 컴퓨터에서 여러 컴퓨터가 있는 것처럼 보이게 한다. 여러 OS를 하나의 하드웨어에서 실행할 수 있게 된다.

엥? 그럼 가상화는 왜 필요할까? 그냥 잘 돌아가는 컴퓨터⋯ 사용하면 되는 것 아닐까? 라고 생각할 수 있겠다. 다시 돌아와서, 왜 가상화라는 것이 Java 플랫폼에 등장하게 되었을까?

JVM 명세의 첫 페이지에는 JVM이 어떻게 탄생했는지에 대한 이야기를 다룬다. 그 기반은 네트워크로 연결된 장치끼리의 소프트웨어 구축 문제를 해결하기 위해서to address the problems of building software for networked consumer devices 였다. 각각의 장치마다, 운영체제와 관계없이 동일한 작동을 보장해야 했다. 플랫폼 독립적platform independent 이라고도 한다.

JVM은 abstract computing machine이다. 실제 존재하는 컴퓨터의 CPU처럼 instruction이 존재하며, 다양한 메모리 영역을 런타임에 조작할 수 있다. 더 나아가, 공식 문서에서는 JVM의 구현체에 대해서 다루지 않는다. 명세specification를 통해 구현체가 만들어야 하는 것들을 적어 두었다. 어떻게 보면 인터페이스에 가깝다고 생각했다. 이 영역에서도 추상화를 진행한다니⋯. 👻

Java Virtual Machine은 Java를 몰라요

The Java Virtual Machine knows nothing of the Java programming language

공식 명세에서는 JVM은 Java에 대해서 하나도 모른다고 한다. 자바를 실행하는 가상 머신이 자바를 모른다니, 이게 말이나 되는 이야기인가? 자바를 모르는데 어떻게 파일을 실행할 수 있을까?

자세히는, 우리가 작성하는 .java 파일에 대해서는 아무것도 모른다. JVM은 컴파일러(javac)를 거치고 나오는 바이트코드 형태인 .class를 어떻게 다뤄야할 지 알고 있다. .class 파일에서 다루는 각종 연산들은 JVM 명세에 적혀 있으며, 이를 해석하고 원하는 행동을 할 수 있도록 구현한다면 나만의 JVM을 만드는 것이 된다.

Java Virtual Machine은 어플리케이션 단계에서 가상화를 진행해, 바이트코드를 하나씩 읽어 기계어로 번역하는 인터프리터interpreter 와 같은 형태이다.

JVM Vendors

위에서 언급했듯, JVM은 명세이다. 구체적인 구현 방법이 적혀있지 않다. -이런 연산을 지원하도록 구현해라- 라고만 적어 두었다. 이를 직접 구현하는 회사를 Vendor라고 하고, 우리가 널리 사용하는 Java를 배포하는 Oracle이 그 중 하나이다.

아래와 같은 다양한 vendor가 존재하고, 각 회사마다 JVM을 구현하는 방법이 서로 다르다. 내부에서 사용하는 Garbage collection이나 최적화 방식도 서로 다를 것이다. 구현에 대한 표준이 없다는 것에 집중하자.

  • Oracle OpenJDK
  • Oracle JDK
  • Amazon Corretto
  • Alibaba Dragonwell

This document specifies an abstract machine.
It does not describe any particular implementation of the Java Virtual Machine.

명세에서 자주 보이는 문구이다. 구현의 표준이 없으며, vendor의 자율성을 최대한 보장한다. 특히나 메모리를 관리하는 부분을 확인할 때면 ‘may be’라는 문구를 자주 확인할 수 있다. ‘~해도 된다’라는 말인데, 그때그때 vendor가 중요하게 생각하는 것에 따라서 이렇게 구현해도, 저렇게 구현해도 좋다는 의미이다.

  • Because the Java Virtual Machine stack is never manipulated directly except to push and pop frames, frames may be heap allocated.
  • ⋯storage management technique may be chosen according to the implementor’s system requirements.
  • ⋯the size of each native method stack may be chosen independently when that stack is created.
  • …등등 여러 알아서 구현하라는 이야기
2장에서 Implement라는 것을 검색하면 60개나 나온다⋯

가상화를 왜 사용하는지, Java가 가상화를 사용하는 목적이 무엇이었는지에 대한 개념 정리가 되었으면 좋겠다. 시간이 난다면 JVM을 직접 구현해보는 건 어떨까⋯ 🙄

Categories