메소드당 오퍼랜드 스택 (최대 65535개 오퍼렌드) + 메소드당 지역 변수 (최대 65535개)
자바 가상 머신(영어: Java Virtual Machine, JVM)은 자바 바이트코드를 실행할 수 있는 주체이다. 일반적으로 인터프리터나 JIT 컴파일 방식으로 다른 컴퓨터 위에서 바이트코드를 실행할 수 있도록 구현되나 jop 자바 프로세서처럼 하드웨어와 소프트웨어를 혼합해 구현하는 경우도 있다. (이론적으로는 100% 하드웨어 구현도 가능하나 비효율적이다) 자바 바이트코드는 플랫폼에 독립적이며 모든 자바 가상 머신은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행한다. 따라서 표준 자바 API까지 동일한 동작을 하도록 구현한 상태에서는 이론적으로 모든 자바 프로그램은 CPU나 운영 체제의 종류와 무관하게 동일하게 동작할 것을 보장한다.
특성
자바 가상 머신은 설계자인 제임스 고슬링(영어: James Gosling)에 따르면 UCSD 파스칼의 p-코드(영어: p-code)와 스몰토크 VM에 영향을 받았다고 한다.[2] 자바 가상 머신은 이 두 가상 머신처럼 스택 기반이어서 대다수의 명령어가 스택 선두에서 피연산자를 택하고 결과는 다시 스택에 넣는다. 스택 상의 피연산자 타입을 구분하고 명령어에 스택 상의 피연산자 타입을 기술하는 면에서는 p-코드와 유사하며[3] 실제 구조에는 차이가 있지만 가비지 컬렉션을 사용하고 객체와 메서드 호출 개념이 있다는 점에서는 스몰토크 가상 머신과 영향을 받았다고 볼 수 있다.[4] 하지만 p-코드가 타입 안전성을 담보하지 못해 메모리 내용을 망가뜨릴 수 있다는 점, 그리고 스몰토크 가상 머신이 동적 타입을 사용하는 스몰토크 언어 자체와 마찬가지로 타입 구분을 하지 않는다는 점에서는 자바 가상 머신과 다르다.
데이터 흐름 분석(영어: data flow analysis)에 기반한 자바 바이트코드 검증기(영어: verifier)를 통해 스택 넘침, 명령어 피연산자의 타입 규칙 위반, 필드 접근 규칙 위반, 지역 변수의 초기화 전 사용 등 많은 문제를 실행 전에 검증하여 실행 시 안전을 보장하고 별도의 부담을 줄여줌
명령어에서 스택에서 가져올 피연산자의 타입을 명령어에 지정(예: 정수 덧셈은 iadd, 단정밀도 실수 덧셈은 fadd)
자바 바이트코드는 주로 자바7로 작성된 소스 코드를 컴파일하여 생성하며 현재 자바 가상 머신의 구조는 자바 언어의 구조를 거의 일대일로 반영하고 있다. 하지만 스칼라 같은 다른 컴파일 언어도 자바 바이트코드를 생성할 수 있으며, 자바로 작성된 자바스크립트 엔진인 라이노(영어: Rhino) 같은 경우는 옵션에 따라 자바 가상 머신 위에서 인터프리터를 실행하기도 하고 자바 바이트코드를 동적으로 생성하기도 한다. 특히 자바 가상 머신 위에서 동적인 스크립트 언어가 널리 쓰이게 되면서 자바(프로그래밍 언어)에서는 동적 타입 언어(영어: dynamically typed language)를 지원하기 위한 추가 명령과 API가 추가되었다.[6] 이러한 다양한 언어 구현이 가능한 것은 다음 특성 때문이라고 할 수 있다.
핫스팟 가상 머신(영어: HotSpot Virtual Machine)같은 고성능 가상 머신 구현: 이를 통해 인터프리터 등 이전에는 실용적이지 못했던 언어 구현이 실용적이 되었다.
클래스로더(영어: classloader): 실행 시 CPU에 독립적인 바이트코드를 생성하고 메모리에 올려서 자바 가상 기계가 빠르게 실행할 수 있는 구조라서 동적인 스크립트 언어 구현에 유용하다.
2016년 5월 기준으로, 자바폴리는 사용자들이 미수정 자바 라이브러리들을 가져와서 자바스크립트로부터 직접 이들을 호출할 수 있게 하고 있다. 자바폴리는 사용자가 자신의 컴퓨터에 자바가 설치되어 있지 않은 상태에서도 웹사이트들이 미수정된 자바 라이브러리를 실행할 수 있게 한다.
자바스크립트로의 컴파일
웹 브라우저가 플러그인을 지원하지 않는 모바일 기기의 사용이 증대되고 자바스크립트의 실행 속도가 지속적으로 개선되면서 자바스크립트로 컴파일하려는 시도들이 있었다.
주요 JVM 바이트코드 대 자바스크립트 컴파일러로는 TeaVM,[7] Dragome Web SDK에 포함된 컴파일러,[8] Bck2Brwsr,[9] j2js-compiler가 있다.[10]
분류
현재 사용되고 있는 자바 가상 머신 규격은 크게 네 가지로 나뉜다. 참고로 자바 플랫폼은 자바 SE, 자바 EE, 자바 ME, 자바 카드로 구분되나 자바 가상 머신 규격은 이 분류와 일치하지는 않는다. 자바 가상 머신 규격[11]에 추가로 현재 자바 ME의 CLDC(Connected Limited Device Configuration)에서 하나 부분 집합, 자바 카드의 클래식 에디션(영어: classic edition), 커넥티드 에디션(영어: connected edition) 각기 하나 씩 부분 집합을 명시하고 있다.
단, 규격이 동일하다고 해서 모두 같은 구현을 사용하지는 않는다. 일례로 자바 SE와 자바 EE, 자바 ME의 CDC(Connected Device Configuration)는 동일한 규격을 사용하고 있으나 함께 정의된 표준 API에서 차이가 있고 사용 환경 자체의 특성에 맞게 만들어진 별도의 구현이 존재한다. 오라클 구현의 경우 자바 SE를 위한 핫스팟 가상 머신은 사용 목적에 따라 최적화와 튜닝이 다른 서버용과 클라이언트용으로 나뉘며 서버용이 주로 자바 EE와 함께 많이 사용된다. 또 자바 ME CDC를 위해서도 적은 메모리와 낮은 CPU 사양에 맞춰진 CVM(C Virtual Machine)이라고 하는 별도 구현을 제공한다.
JVM은 자바 플랫폼의 주요한 부분이며 마이크로소프트 윈도우(95/98/NT), 리눅스, 유닉스, OS X 등 대부분의 운영 체제는 물론, 인터넷 익스플로러와 넷스케이프 등과 같은 웹 브라우저 등 여러 가지 플랫폼에 설치되어 사용될 수 있으며, 휴대전화나 가전기기에도 설치할 수 있다. 따라서 자바 플랫폼은 여러 플랫폼을 지원하여 미들웨어로서의 역할과 플랫폼 스스로의 역할을 동시에 수행할 수 있다. 사용자는 자바 바이트코드로 컴파일된 자바 프로그램을 실행시키기 위해서 이 자바 가상 머신을 이용하면 된다.
오라클(구 썬 마이크로시스템즈)에서 제공하는 자바 가상 머신 말고도 각 운영 체제 개발사가 제공하는 자바 가상 머신 및 오픈소스로 개발된 구형 버전의 온전한 자바 VM도 있으며, GNU의 GCJ나 아파치 소프트웨어 재단(ASF: Apache Software Foundation)의 하모니(Harmony)와 같은 아직은 완전하지 않지만 지속적인 오픈 소스 자바 가상 머신도 존재한다. 이러한 공개 소프트웨어 단체의 움직임에 따라 썬 마이크로시스템즈에서도 자사의 자바 가상 머신 및 개발 도구 킷을 오픈 소스 정책에 맞추어 공개한 상황이다.
↑JVM과 그와 밀접하고 필수적인 표준 API를 정의하는 configuration을 기준으로 실제 사용되는 플랫폼은 목표 환경에 맞게 API를 추가한 프로파일(profile)들이다. 추가되는 APII는 일반적으로 자바 SE에서 부분 집합을 가져 오나 javax.microedition 패키지에 임베디드 시스템 전용 API를 추가하기도 한다.