자바 가상 머신

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색

자바 가상 머신(영어: Java Virtual Machine, JVM)은 자바 바이트코드를 실행할 수 있는 주체이다. 일반적으로 인터프리터JIT 컴파일 방식으로 다른 컴퓨터 위에서 바이트코드를 실행할 수 있도록 구현되나 자바 프로세서처럼 하드웨어와 소프트웨어를 혼합해 구현하는 경우도 있다. (이론적으로는 100% 하드웨어 구현도 가능하나 비효율적이다) 자바 바이트코드는 플랫폼에 독립적이며 모든 자바 가상 머신은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행한다. 따라서 표준 자바 API까지 동일한 동작을 하도록 구현한 상태에서는 이론적으로 모든 자바 프로그램은 CPU나 운영 체제의 종류와 무관하게 동일하게 동작할 것을 보장한다.

특성[편집]

자바 가상 머신은 설계자인 제임스 고슬링(영어: James Gosling)에 따르면 UCSD 파스칼의 p-코드(영어: p-code)와 스몰토크 VM에 영향을 받았다고 한다.[1] 자바 가상 머신은 이 두 가상 머신처럼 스택 기반이어서 대다수의 명령어가 스택 선두에서 피연산자를 택하고 결과는 다시 스택에 넣는다. 스택 상의 피연산자 타입을 구분하고 명령어에 스택 상의 피연산자 타입을 기술하는 면에서는 p-코드와 유사하며[2] 실제 구조에는 차이가 있지만 가비지 컬렉션을 사용하고 객체와 메서드 호출 개념이 있다는 점에서는 스몰토크 가상 머신과 영향을 받았다고 볼 수 있다.[3] 하지만 p-코드가 타입 안전성을 담보하지 못해 메모리 내용을 망가뜨릴 수 있다는 점, 그리고 스몰토크 가상 머신이 동적 타입을 사용하는 스몰토크 언어 자체와 마찬가지로 타입 구분을 하지 않는다는 점에서는 자바 가상 머신과 다르다.

자바 가상 머신의 특성은 다음과 같다.[4]

  • 스택 기반의 가상 머신
  • 단일 상속 형태의 객체 지향 프로그래밍을 가상 머신 수준에서 구현
  • 포인터를 지원하되 C와 같이 주소 값을 임의로 조작이 가능한 포인터 연산이 불가능
  • 가비지 컬렉션 사용
  • 모든 기본 타입의 정의를 명확히 함으로써 플랫폼 독립성 보장
  • 데이터 흐름 분석(영어: data flow analysis)에 기반한 자바 바이트코드 검증기(영어: verifier)를 통해 스택 넘침, 명령어 피연산자의 타입 규칙 위반, 필드 접근 규칙 위반, 지역 변수의 초기화 전 사용 등 많은 문제를 실행 전에 검증하여 실행 시 안전을 보장하고 별도의 부담을 줄여줌
  • 명령어에서 스택에서 가져올 피연산자의 타입을 명령어에 지정(예: 정수 덧셈은 iadd, 단정도 실수 덧셈은 fadd)

분류[편집]

현재 사용되고 있는 자바 가상 머신 규격은 크게 네 가지로 나뉜다. 참고로 자바 플랫폼자바 SE, 자바 EE, 자바 ME, 자바 카드로 구분되나 자바 가상 머신 규격은 이 분류와 일치하지는 않는다. 자바 가상 머신 규격[5]에 추가로 현재 자바 MECLDC(Connected Limited Device Configuration)에서 하나 부분 집합, 자바 카드의 클래식 에디션(영어: classic edition), 커넥티드 에디션(영어: connected edition) 각기 하나 씩 부분 집합을 명시하고 있다.

단, 규격이 동일하다고 해서 모두 같은 구현을 사용하지는 않는다. 일례로 자바 SE자바 EE, 자바 MECDC(Connected Device Configuration)는 동일한 규격을 사용하고 있으나 함께 정의된 표준 API에서 차이가 있고 사용 환경 자체의 특성에 맞게 만들어진 별도의 구현이 존재한다. 오라클 구현의 경우 자바 SE를 위한 핫스팟 가상 머신은 사용 목적에 따라 최적화와 튜닝이 다른 서버용과 클라이언트용으로 나뉘며 서버용이 주로 자바 EE와 함께 많이 사용된다. 또 자바 ME CDC를 위해서도 적은 메모리와 낮은 CPU 사양에 맞춰진 CVM(C Virtual Machine)이라고 하는 별도 구현을 제공한다.

항목 자바 SE 자바 EE 자바 ME[6] 자바 카드
CLDC CDC Classic Edition Connected Edition
개요 모든 자바 플랫폼의 기본이 되는 플랫폼으로 자바 가상 머신, 자바 언어 규격 제정의 기준이 된다. 데스크톱 환경 및 서버 환경에서 공히 널리 사용된다. 기업 서버 환경에서 사용될 목적으로 제정된 플랫폼으로 자바 SE에 추가 API가 더 정의된 형태이다. 저사양 임베디드 시스템을 위한 플랫폼으로 특히 스마트폰이 아닌 피쳐폰에서 많이 사용된다. 8~32MHz 클럭으로 동작하는 16비트 혹은 32비트 프로세서, 최소 160KB ROM(Flash), 32KB RAM을 목표로한 플랫폼이다.[7] 상대적으로 고사양 임베디드 시스템을 위한 플랫폼으로 디지털 TV블루레이 디스크 플레이어에 널리 사용되고 있다. 원래는 스마트폰 같은 고사양 휴대폰에도 CDC를 보급하는 것이 목적이었으나 안드로이드, iOS 위주로 재편된 시장에서는 거의 사용되지 않는다. 메모리/CPU가 제약된 스마트카드용 플랫폼으로 목표 환경은 통상 RAM 1.2KB, EEPROM이나 flash 16KB, ROM 32~48K 정도를 가진다.[8] 스마트카드의 고사양화에 의해 새로 추가된 플랫폼이다. 최소 환경은 비휘발성 메모리 176 KB[9], RAM 16KB를 요구한다. 통상적으로는 ROM 512KB, 읽고 쓸 수 있는 비휘발성 메모리 128KB, RAM 24KB 정도의 환경을 목표로 한다.[8]
JVM 규격 자바 가상 머신 규격에 따르는 VM 규격 사용 자바 SE와 동일 다음과 같은 부분 집합:[7]
  • 사용자 정의 클래스 로더 제외
  • 스레드 그룹 및 데몬 스레드 제외
  • 객체 종결(finalization) 제외
  • 비동기 예외 제외
  • 리플렉션(reflection) 제외
  • 약한 레퍼런스(weak reference)를 제외한 레퍼런스 객체 제외
  • 실행 시 참조할 수 있는 애노테이션(annotation) 제외
  • Assertion 제외
자바 SE와 동일하나 일부 핵심 API만 부분 집합 다음과 같은 부분 집합:[8]
  • 동적 클래스 로딩 제외
  • 보안 관리자(Security Manager) 제외
  • 객체 종결(finalization) 제외
  • 객체 복제(cloning) 제외
  • 자바 패키지 접근 권한 제어 일부 제한
  • 참조(reference) 객체 제외
  • 실행 시 참조할 수 있는 애노테이션(annotation) 제외
  • Assertion 제외
  • 클래스 파일 형식 대신 CAP (Converted Applet) 파일 사용
  • char, double, float, long 타입 제외
다음과 같은 부분 집합:[8]
  • 부동소수점 타입 미지원
  • 사용자 정의 클래스 로드 제외
  • 스레드 그룹 및 데몬 스레드 제외
  • 객체 종결(finialization) 제외
  • 비동기 예외 제외
  • 리플렉션(reflection) 제외
  • 참조(reference) 객체 제외
  • 실행 시 참조할 수 있는 애노테이션(annotation) 제외
  • Assertion 제외
API
주요 구현 오라클 HotSpot VM[10], 오라클 JRocket[11] (추후 두 VM을 하나로 통합 예정) Java SE와 차이 없으며 HotSpot VM의 경우 서버용으로 튜닝된 버전이 있음 오라클 KVM[12], IBM WEME(WebSphere Everyplace Micro Environment)[13] : 동일한 코드에서 CLDC/CDC 버전을 도출

구현[편집]

JVM은 자바 플랫폼의 주요한 부분이며 마이크로소프트 윈도(95/98/NT), 리눅스, 유닉스, 맥 오에스 텐 등 대부분의 운영 체제는 물론, 인터넷 익스플로러와 넷스케이프 등과 같은 웹 브라우저 등 여러가지 플랫폼에 설치되어 사용될 수 있으며, 휴대전화나 가전기기에도 설치할 수 있다. 따라서 자바 플랫폼은 여러 플랫폼을 지원하여 미들웨어로서의 역할과 플랫폼 스스로의 역할을 동시에 수행할 수 있다. 사용자는 자바 바이트코드로 컴파일된 자바 프로그램을 실행시키기 위해서 이 자바 가상 머신을 이용하면 된다.

오라클(구 썬 마이크로시스템즈)에서 제공하는 자바 가상 머신 말고도 각 운영 체제 개발사가 제공하는 자바 가상 머신이 있으며, GNU의 GCJ나 아파치 소프트웨어 재단(ASF: Apache Software Foundation)의 하모니(Harmony)와 같은 오픈 소스 자바 가상 머신도 존재한다. 이러한 공개 소프트웨어 단체의 움직임에 따라 썬 마이크로시스템즈에서도 자사의 자바 가상 머신 및 개발 도구 킷을 오픈 소스 정책에 맞추어 공개한 상황이다.

지원 언어[편집]

자바 바이트코드는 주로 자바로 작성된 소스 코드를 컴파일하여 생성하며 현재 자바 가상 머신의 구조는 자바 언어의 구조를 거의 일대일로 반영하고 있다. 하지만 스칼라 같은 다른 컴파일 언어도 자바 바이트코드를 생성할 수 있으며, 자바로 작성된 자바스크립트 엔진인 라이노(영어: Rhino) 같은 경우는 옵션에 따라 자바 가상 머신 위에서 인터프리터를 실행하기도 하고 자바 바이트코드를 동적으로 생성하기도 한다. 특히 자바 가상 머신 위에서 동적인 스크립트 언어가 널리 쓰이게 되면서 자바 7에서는 동적 타입 언어(영어: dynamically typed language)를 지원하기 위한 추가 명령과 API가 추가되었다.[16] 이러한 다양한 언어 구현이 가능한 것은 다음 특성 때문이라고 할 수 있다.

  • 핫스팟 가상 머신(영어: HotSpot Virtual Machine)같은 고성능 가상 머신 구현: 이를 통해 인터프리터 등 이전에는 실용적이지 못했던 언어 구현이 실용적이 되었다.
  • 클래스로더(영어: classloader): 실행 시 CPU에 독립적인 바이트코드를 생성하고 메모리에 올려서 자바 가상 기계가 빠르게 실행할 수 있는 구조라서 동적인 스크립트 언어 구현에 유용하다.

자바 가상 머신에서 사용할 수 있는 언어는 자바 가상 머신 지원 언어 목록을 참고한다.

같이 보기[편집]

주석[편집]

  1. 제임스 고슬링의 ACM Queue 인터뷰 내용
  2. UCSD p-코드 머신 구조
  3. 스몰토크 블루북 26장
  4. 제임스 고슬링이 쓴 자바 백서
  5. 자바 가상 머신 규격
  6. JVM과 그와 밀접하고 필수적인 표준 API를 정의하는 configuration을 기준으로 실제 사용되는 플랫폼은 목표 환경에 맞게 API를 추가한 프로파일(profile)들이다. 추가되는 APII는 일반적으로 자바 SE에서 부분 집합을 가져 오나 javax.microedition 패키지에 임베디드 시스템 전용 API를 추가하기도 한다.
  7. CLDC 1.1 JSR 페이지
  8. 자바 카드 3.0.1 규격 다운로드 페이지
  9. ROM 및 읽고 쓸 수 있는 비휘발성 메모리인 EEPOM/flash/배터리 달린 SDRAM 포함
  10. HotSpot VM 홈페이지
  11. JRocket 홈페이지
  12. 오라클 모바일 자바 참조 구현 다운로드 페이지
  13. WEME 홈페이지
  14. Java ME for Embedded 문서 페이지
  15. JBed 홈페이지
  16. 자바 7 다중 언어 지원 가이드

바깥 고리[편집]