자바 가상 머신

자바 프로그래밍 언어로 작성된 프로그램을 컴파일한 결과물인 자바 바이트코드를 실행할 수 있는 런타임 환경
(자바가상기계에서 넘어옴)

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

자바 가상 머신
Java virtual machine
설계 기업 및 설계자썬 마이크로시스템즈
비트32비트
발표1994년
버전20.0.1[1]
유형스택레지스터-레지스터
인코딩가변
분기비교 및 분기
엔디언Big
개방 여부
레지스터
범용 목적메소드당 오퍼랜드 스택 (최대 65535개 오퍼렌드) + 메소드당 지역 변수 (최대 65535개)
자바 가상 머신 사양의 자바 SE 7 에디션에 기반을 둔 자바 가상 머신(JVM) 아키텍처의 개요도.

특성 편집

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

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

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

JVM 사양 편집

클래스 로더 편집

바이트코드 명령어 편집

JVM 언어 편집

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

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

웹 브라우저에서의 JVM 편집

자바 애플릿 편집

자바스크립트 JVM과 인터프리터 편집

2016년 5월 기준으로, 자바폴리는 사용자들이 미수정 자바 라이브러리들을 가져와서 자바스크립트로부터 직접 이들을 호출할 수 있게 하고 있다. 자바폴리는 사용자가 자신의 컴퓨터에 자바가 설치되어 있지 않은 상태에서도 웹사이트들이 미수정된 자바 라이브러리를 실행할 수 있게 한다.

자바스크립트로의 컴파일 편집

웹 브라우저가 플러그인을 지원하지 않는 모바일 기기의 사용이 증대되고 자바스크립트의 실행 속도가 지속적으로 개선되면서 자바스크립트로 컴파일하려는 시도들이 있었다.

주요 JVM 바이트코드 대 자바스크립트 컴파일러로는 TeaVM,[7] Dragome Web SDK에 포함된 컴파일러,[8] Bck2Brwsr,[9] j2js-compiler가 있다.[10]

분류 편집

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

구현 편집

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

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

같이 보기 편집

각주 편집

  1. yan (2023년 6월 24일). “JDK 20 Release Notes”. 《Oracle Corporation》. 2021년 7월 9일에 원본 문서에서 보존된 문서. 2023년 6월 24일에 확인함. 
  2. 제임스 고슬링의 ACM Queue 인터뷰 내용
  3. “UCSD p-코드 머신 구조”. 2011년 4월 4일에 원본 문서에서 보존된 문서. 2010년 12월 20일에 확인함. 
  4. 스몰토크 블루북 26장
  5. 제임스 고슬링이 쓴 자바 백서
  6. 자바 7 다중 언어 지원 가이드
  7. “TeaVM project home page”. Teavm.org. 2015년 6월 26일에 확인함. 
  8. “Dragome Web SDK”. Dragome.com. 2015년 6월 26일에 확인함. 
  9. “Bck2Brwsr - APIDesign”. Wiki.apidesign.org. 2015년 6월 26일에 확인함. 
  10. Wolfgang Kuehn (decatur). j2js-compiler GitHub
  11. 자바 가상 머신 규격
  12. JVM과 그와 밀접하고 필수적인 표준 API를 정의하는 configuration을 기준으로 실제 사용되는 플랫폼은 목표 환경에 맞게 API를 추가한 프로파일(profile)들이다. 추가되는 APII는 일반적으로 자바 SE에서 부분 집합을 가져 오나 javax.microedition 패키지에 임베디드 시스템 전용 API를 추가하기도 한다.
  13. CLDC 1.1 JSR 페이지
  14. 자바 카드 3.0.1 규격 다운로드 페이지
  15. ROM 및 읽고 쓸 수 있는 비휘발성 메모리인 EEPOM/flash/배터리 달린 SDRAM 포함
  16. HotSpot VM 홈페이지
  17. JRocket 홈페이지
  18. 오라클 모바일 자바 참조 구현 다운로드 페이지
  19. WEME 홈페이지
  20. Java ME for Embedded 문서 페이지
  21. JBed 홈페이지

외부 링크 편집