{{위키데이터 속성 추적}}
{{다른 뜻 넘어옴|JVM}}
{{Infobox CPU architecture
| name       = 자바 가상 머신<br />Java virtual machine
| designer   = [[썬 마이크로시스템즈]]
| bits       = [[32비트 컴퓨팅|32비트]]
| introduced = 1994년
| version    = 20.0.1<ref name="latest-stable-JDK20">{{웹 인용|author=yan|date=2023-06-24|url=https://www.oracle.com/java/technologies/javase/20u-relnotes.html|title=JDK 20 Release Notes |website=[[Oracle Corporation]]|access-date=2023-06-24|archive-date=2021-07-09|archive-url=https://web.archive.org/web/20210709182235/https://hg.openjdk.java.net/jdk-updates/jdk15u/rev/1055f2102e6e|url-status=live}}</ref>
| design     = 
| type       = [[스택 머신|스택]] 및 [[로드/스토어 아키텍처|레지스터-레지스터]]
| encoding   = 가변
| branching  = 비교 및 분기
| endianness = [[엔디언|Big]]
| page size  = 
| extensions = 
| open       = 예
| registers  = 
| gpr        = 메소드당 오퍼랜드 스택 (최대 65535개 오퍼렌드) + 메소드당 지역 변수 (최대 65535개)
| fpr        = 
}}
[[파일:JvmSpec7.png|섬네일|400px|자바 가상 머신 사양의 자바 SE 7 에디션에 기반을 둔 자바 가상 머신(JVM) 아키텍처의 개요도.]]
'''자바 가상 머신'''({{llang|en|Java Virtual Machine}}, '''JVM''')은 [[자바 바이트코드]]를 실행할 수 있는 주체이다. 일반적으로 [[인터프리터]]나 [[JIT 컴파일]] 방식으로 다른 컴퓨터 위에서 바이트코드를 실행할 수 있도록 구현되나 jop [[자바 프로세서]]처럼 하드웨어와 소프트웨어를 혼합해 구현하는 경우도 있다. (이론적으로는 100% 하드웨어 구현도 가능하나 비효율적이다) 자바 바이트코드는 플랫폼에 독립적이며 모든 자바 가상 머신은 자바 가상 머신 규격에 정의된 대로 자바 바이트코드를 실행한다. 따라서 표준 자바 API까지 동일한 동작을 하도록 구현한 상태에서는 이론적으로 모든 자바 프로그램은 CPU나 운영 체제의 종류와 무관하게 동일하게 동작할 것을 보장한다.

== 특성 ==
자바 가상 머신은 설계자인 [[제임스 고슬링]]({{llang|en|James Gosling}})에 따르면 UCSD [[파스칼 (프로그래밍 언어)|파스칼]]의 p-코드({{llang|en|p-code}})와 [[스몰토크]] VM에 영향을 받았다고 한다.<ref>[http://queue.acm.org/detail.cfm?id=1017013 제임스 고슬링의 ACM Queue 인터뷰 내용]</ref> 자바 가상 머신은 이 두 가상 머신처럼 스택 기반이어서 대다수의 명령어가 스택 선두에서 피연산자를 택하고 결과는 다시 스택에 넣는다. 스택 상의 피연산자 타입을 구분하고 명령어에 스택 상의 피연산자 타입을 기술하는 면에서는 p-코드와 유사하며<ref>{{웹 인용 |url=http://miller.emu.id.au/pmiller/ucsd-psystem-um/reconstruct/03-04-pseudo-machine.html |제목=UCSD p-코드 머신 구조 |확인날짜=2010-12-20 |보존url=https://web.archive.org/web/20110404224918/http://miller.emu.id.au/pmiller/ucsd-psystem-um/reconstruct/03-04-pseudo-machine.html |보존날짜=2011-04-04 |url-status=dead }}</ref> 실제 구조에는 차이가 있지만 [[쓰레기 수집 (컴퓨터 과학)|가비지 컬렉션]]을 사용하고 객체와 메서드 호출 개념이 있다는 점에서는 스몰토크 가상 머신과 영향을 받았다고 볼 수 있다.<ref>[http://www.mirandabanda.org/bluebook/bluebook_chapter26.html 스몰토크 블루북 26장]</ref> 하지만 p-코드가 타입 안전성을 담보하지 못해 메모리 내용을 망가뜨릴 수 있다는 점, 그리고 스몰토크 가상 머신이 동적 타입을 사용하는 스몰토크 언어 자체와 마찬가지로 타입 구분을 하지 않는다는 점에서는 자바 가상 머신과 다르다.

자바 가상 머신의 특성은 다음과 같다.<ref>[http://java.sun.com/docs/white/langenv/ 제임스 고슬링이 쓴 자바 백서]</ref>

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

== JVM 사양 ==
=== 클래스 로더 ===
{{본문|자바 클래스로더}}
=== 바이트코드 명령어 ===
{{본문|자바 바이트코드}}
=== JVM 언어 ===
{{본문|자바 가상 머신 지원 언어}}
자바 바이트코드는 주로 [[자바 (프로그래밍 언어)|자바7]]로 작성된 [[소스 코드]]를 컴파일하여 생성하며 현재 자바 가상 머신의 구조는 자바 언어의 구조를 거의 일대일로 반영하고 있다. 하지만 [[스칼라 (프로그래밍 언어)|스칼라]] 같은 다른 컴파일 언어도 자바 바이트코드를 생성할 수 있으며, 자바로 작성된 [[자바스크립트]] 엔진인 [[라이노 (프로그래밍 언어)|라이노]]({{llang|en|Rhino}}) 같은 경우는 옵션에 따라 자바 가상 머신 위에서 [[인터프리터]]를 실행하기도 하고 자바 바이트코드를 동적으로 생성하기도 한다. 특히 자바 가상 머신 위에서 동적인 [[스크립트 언어]]가 널리 쓰이게 되면서 [[자바 7|자바(프로그래밍 언어)]]에서는 동적 타입 언어({{llang|en|dynamically typed language}})를 지원하기 위한 추가 명령과 API가 추가되었다.<ref>[http://download.oracle.com/javase/7/docs/technotes/guides/vm/multiple-language-support.html 자바 7 다중 언어 지원 가이드]</ref> 이러한 다양한 언어 구현이 가능한 것은 다음 특성 때문이라고 할 수 있다.

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

== 웹 브라우저에서의 JVM ==
=== 자바 애플릿 ===
{{본문|자바 애플릿}}
=== 자바스크립트 JVM과 인터프리터 ===
2016년 5월 기준으로, [[자바폴리]]는 사용자들이 미수정 자바 라이브러리들을 가져와서 자바스크립트로부터 직접 이들을 호출할 수 있게 하고 있다. 자바폴리는 사용자가 자신의 컴퓨터에 자바가 설치되어 있지 않은 상태에서도 웹사이트들이 미수정된 자바 라이브러리를 실행할 수 있게 한다.
=== 자바스크립트로의 컴파일 ===
웹 브라우저가 플러그인을 지원하지 않는 모바일 기기의 사용이 증대되고 자바스크립트의 실행 속도가 지속적으로 개선되면서 자바스크립트로 컴파일하려는 시도들이 있었다.

주요 JVM 바이트코드 대 자바스크립트 컴파일러로는 TeaVM,<ref>{{웹 인용 |url = http://teavm.org/ |title = TeaVM project home page |publisher = Teavm.org |accessdate = 2015-06-26 }}</ref> Dragome Web SDK에 포함된 컴파일러,<ref>{{웹 인용 |url = http://www.dragome.com/ |title = Dragome Web SDK |publisher = Dragome.com |accessdate = 2015-06-26 }}</ref> Bck2Brwsr,<ref>{{웹 인용 |url = http://wiki.apidesign.org/wiki/Bck2Brwsr |title = Bck2Brwsr - APIDesign |publisher = Wiki.apidesign.org |accessdate = 2015-06-26 }}</ref> j2js-compiler가 있다.<ref>Wolfgang Kuehn (decatur). [https://github.com/decatur/j2js-compiler j2js-compiler] GitHub</ref>

== 분류 ==
현재 사용되고 있는 자바 가상 머신 규격은 크게 네 가지로 나뉜다. 참고로 [[자바 플랫폼]]은 [[자바 SE]], [[자바 EE]], [[자바 ME]], [[자바 카드]]로 구분되나 자바 가상 머신 규격은 이 분류와 일치하지는 않는다. 자바 가상 머신 규격<ref>[http://java.sun.com/docs/books/jvms/ 자바 가상 머신 규격]</ref>에 추가로 현재 [[자바 ME]]의 {{lang|en|CLDC}}({{lang|en|Connected Limited Device Configuration}})에서 하나 부분 집합, [[자바 카드]]의 클래식 에디션({{llang|en|classic edition}}), 커넥티드 에디션({{llang|en|connected edition}}) 각기 하나 씩 부분 집합을 명시하고 있다.

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

{{자바 플랫폼 분류}}

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

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

== 같이 보기 ==
* [[가상 머신]]
* [[GNU 클래스패스]]
* [[안드로이드 (운영 체제)|안드로이드]] [[달빅 (소프트웨어)|달빅VM]]
* [[OpenJDK]]

== 각주 ==
{{각주}}
*[참고] [http://www.zdnet.co.kr/view/?no=00000039137851 zd.net코리아 - 오픈소스 자바 프로젝트「소스코드를 기부해달라」Ingrid Marson (ZDNet UK)]

== 외부 링크 ==
* [http://java.sun.com/docs/books/vmspec/ 자바 가상 머신 규격]
* [http://java-virtual-machine.net/download.html Java 가상 머신(JVM) 다운로드]
* {{dmoz|Computers/Programming/Languages/Java/Implementations|자바 구현}}

{{자바 가상 머신}}
{{자바 (소프트웨어 플랫폼)}}

[[분류:자바 가상 머신| ]]
[[분류:자바 플랫폼 소프트웨어]]
[[분류:자바 플랫폼]]
[[분류:자바 사양 요청]]