1 분 소요

JVM이란?

JVM이란 Java Virtual Machine의 약자로써, 자바 가상 머신을 줄여 부르는 용어이다. (여기서 가상 머신이란 프로그램을 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것이다.)

image

JVM의 존재 이유

먼저, Java는 OS(Operationg System, 운영체제)에 종속적이지 않다는 특징을 가지고 있다. 그 이유는 JVM에서 바이트 코드로 컴파일된 자바 프로그램이 OS에 의존하지 않고도 실행될 수 있기 때문이다.

  • 즉, 자바 언어로 작성된 프로그램은 어떤 OS에서든 실행될 수 있다는 말이다. 그리고 그 이유가 자바 언어가 OS에서 독립적인 특징을 가지고 있기 때문에 가능한 것이다.

다른 언어와의 비교

예를들어, C언어의 경우 해당 언어로 작성된 프로그램은 컴파일러(compiler)가 해당 OS에서 지원 되지 않는 경우, 해당 OS에서 실행될 수 없다. OS에서 지원하는 특정 언어만 실행이 가능하다는 말이다. 자바 언어로 작성된 프로그램은 JVM을 통해 OS에 상관없이 실행이 가능하단 뜻이다.

  • 이러한 특징은 자바 언어로 작성된 프로그램이 이식성(protablility)이 높고, 유지 보수가 용이하도록 만들어준다.

JVM의 구성 요소

  • 클래스 로더(Class Loader)
  • 실행 엔진(Execution Engine)
    • 인터프리터(Interpreter)
    • JIT 컴파일러(Just-in-Time)
    • 가비지 콜렉터(Garbage collector)
  • 런타임 데이터 영역(Runttime Data Area)

클래스 로더

클래스 로더는 자바 클래스 파일을 로딩하고, JVM이 사용할 수 있는 바이트 코드로 변환하는 역할을 한다. 클래스 로더는 새로운 클래스가 필요할 때마다 클래스 파일을 찾아서 로딩하고, 로딩된 클래스는 JVM의 메모리 영역인 런타임 데이터 영역에 저장된다. 즉, JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다.

실행 엔진(Execution Engine)

실행 엔진은 클래스 로더에 의해 로딩된 바이트 코드를 실행하는 역할을 한다. 실행 엔진은 크게 인터프리터(Interpreter)와 JIT 컴파일러(Just-in-Time Compiler)로 나뉜다.

  • 인터 프리터는 바이트 코드를 한 줄씩 해석하여 실행하는 방식이다. 인터프리터는 바로 실행할 수 있지만, 실행속도가 느리기 때문에, 반복적으로 실행되는 코드는 JIT 컴파일러를 통해 네이티브 코드(native code)로 변환된다.
  • JIT 컴파일러는 인터프리터보다 빠른 실행 속도를 제공하기 위해 사용되는 기술이다. JIT 컴파일러는 인터프리터가 바이트 코드를 해석하며, 실행하는 동안, 자주 사용되는 코드를 네이티브 코드로 변환하여 캐시로 저장한다. 그리고 같은 코드가 반복적으로 실행될 때, 이 캐시에서 바로 실행되도록 한다.
  • 가비지 콜렉터(Garbage Collector)는 자바에서 메모리 관리를 담당한다. 가비지 콜렉터는 뜻 그대로 불필요한 것들을 찾는 것인데, 더 이상 사용되지 않는 객체를 자동으로 탐지하고 제거하며, 메모리를 관리한다. 이를 통해 개발자가 직접 메모리 관리를 하지 않아도 된다.

런타임 데이터 영역(Runtime Data Area)

런타임 데이터 영역은 JVM이 프로그램을 실행하는 동안 사용하는 메모리 영역이다. 런타임 데이터 영역은 크게 세 가지 영역으로 나뉜다.

  • 메소드 영역(Method Area): 클래스 정보와 정적(static) 변수를 저장한다.
  • 힙 영역(Heap): 객체 인스턴스를 저장한다.
  • 스택 영역(Stack): 메소드 호출 시 생성되는 지역(local) 변수와 연산에 필요한 값 등을 저장한다.

업데이트: