맨위로가기

자바 가상 머신

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

자바 가상 머신(JVM)은 자바 런타임 환경의 핵심 구성 요소로, 자바 바이트코드를 실행하는 추상 컴퓨터이다. 제임스 고슬링의 영향을 받아 스택 기반으로 설계되었으며, 가비지 컬렉션, 객체 지향 프로그래밍, 타입 안전성을 특징으로 한다. JVM은 명세에 의해 정의되며, 핫스팟과 JRockit과 같은 다양한 구현체가 존재한다. 주요 기능으로는 클래스 로딩, 바이트코드 검증, JIT 컴파일 등이 있으며, 다양한 JVM 언어를 지원한다. 또한, 과거 웹 브라우저에서 자바 애플릿 실행에 사용되었으나, 현재는 웹 브라우저 플러그인 지원 중단으로 사용 빈도가 감소했다. JVM은 자바 SE, EE, ME, 카드 등 다양한 플랫폼에서 사용되며, 각 플랫폼에 맞는 규격과 구현체를 가진다.

더 읽어볼만한 페이지

  • 자바 가상 머신 - 핫스팟 (가상 머신)
    핫스팟은 오라클의 자바 런타임 환경에 포함된 가상 머신으로, 반복되는 코드 영역을 최적화하는 JIT 컴파일러이며, 1999년 출시 후 GNU GPL 라이선스로 사용 가능하다.
  • 자바 가상 머신 - 안드로이드 런타임
    안드로이드 런타임(ART)은 안드로이드 운영 체제에서 애플리케이션 실행을 위한 런타임 환경이며, AOT 컴파일을 통해 실행 효율성을 높이고 전력 소비를 줄이는 장점을 가진다.
  • 자바 사양 요청 - 자바 플랫폼, 마이크로 에디션
    자바 ME는 임베디드 및 모바일 장치에서 자바 앱을 실행하는 플랫폼으로, 피처폰에서 주로 사용되었으며 다양한 프로파일과 에뮬레이터, 개발 도구를 제공하고 JSR을 통해 기능이 확장된다.
  • 자바 사양 요청 - 자바 커뮤니티 프로세스
    자바 커뮤니티 프로세스는 자바 기술 명세의 개발 및 관리를 담당하는 조직으로, 자바 기술 표준화와 발전에 기여해왔으나 운영 방식에 대한 비판과 여러 논란에 직면해 있다.
  • 자바 플랫폼 소프트웨어 - 자바 데스크톱 시스템
  • 자바 플랫폼 소프트웨어 - 핫자바
    핫자바는 자바 프로그래밍 언어 기반으로 개발된 웹 브라우저이며, 1995년 TED 컨퍼런스에서 처음 시연되고 SunWorld 컨퍼런스에서 공식 발표되었다.
자바 가상 머신
자바 가상 머신 정보
이름자바 가상 머신
영어 이름Java virtual machine
다른 이름Java VM
설계자썬 마이크로시스템즈
비트32비트
출시 년도1994년
최신 버전20.0.1
유형스택 및 레지스터-레지스터
인코딩가변
분기비교 및 분기
엔디언Big
개방 여부
범용 레지스터메소드당 오퍼랜드 스택 (최대 65535개 오퍼렌드) + 메소드당 지역 변수 (최대 65535개)

2. 특성

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

JVM의 주요 특성은 다음과 같다.[32]


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

3. JVM 사양

자바 가상 머신(JVM)은 명세에 의해 정의된 추상적인(가상) 컴퓨터로, 자바 런타임 환경(JRE)의 일부이다. 가비지 컬렉션 알고리즘 및 JVM 명령어의 내부 최적화(명령어의 기계어로 변환)는 명세에 포함되지 않아 구현자에게 자율성을 부여한다.[2] 모든 자바 애플리케이션은 JVM 추상 명세의 구체적인 구현 내에서만 실행될 수 있다.

자바 플랫폼, 스탠다드 에디션(J2SE) 5.0부터 JVM 명세 변경 사항은 JSR 924로서 자바 커뮤니티 프로세스 하에 개발되었다.[3] 클래스 파일 형식(JSR 202)에 제안된 변경 사항을 지원하기 위한 명세 변경은 JSR 924의 유지 보수 릴리스로 진행되고 있다.[4] JVM 명세는 "블루 북"으로 출판되었으며,[5] 썬 마이크로시스템즈는 이 명세가 호환 가능한 클린룸 구현을 가능하게 할 것이라고 예상했다.

오라클의 JVM에는 핫스팟BEA 시스템즈로부터 상속받은 JRockit이 있다. 오라클은 구현 제품군이 오라클의 명세와 완전히 호환됨을 인증하기 위해 자바 상표 사용을 허용한다.

3. 1. 클래스 로더

클래스 로더는 다음 세 가지 기본 작업을 엄격한 순서대로 수행한다.[1]

1. 로딩(Loading): 형식에 대한 이진 데이터를 찾아 가져온다.[1]

2. 연결(Linking): 검증, 준비 및 (선택 사항) 해결을 수행한다.[1]

  • 검증(Verification): 가져온 형식의 정확성을 확인한다.[1]
  • 준비(Preparation): 클래스 변수에 대한 메모리를 할당하고 메모리를 기본값으로 초기화한다.[1]
  • 해결(Resolution): 형식의 기호 참조를 직접 참조로 변환한다.[1]

3. 초기화(Initialization): 클래스 변수를 적절한 시작 값으로 초기화하는 자바 코드를 호출한다.[1]

일반적으로 부트스트랩 클래스 로더, 확장 클래스 로더, 시스템/애플리케이션 클래스 로더의 세 가지 유형의 클래스 로더가 있다.[1]

JVM 바이트 코드의 구성 단위 중 하나는 클래스이다. 클래스 로더 구현은 자바 클래스 파일 형식에 부합하는 모든 것을 인식하고 로드할 수 있어야 한다.[1] 어떤 구현이든 'class' 파일 외 다른 이진 형식을 인식할 수 있지만, 'class' 파일은 반드시 인식해야 한다.[1]

모든 자바 가상 머신 구현에는 신뢰할 수 있는 클래스를 로드할 수 있는 부트스트랩 클래스 로더와 확장 클래스 로더 또는 애플리케이션 클래스 로더가 있어야 한다.[1] 자바 가상 머신 사양은 클래스 로더가 클래스를 어떻게 찾아야 하는지에 대해서는 명시하지 않는다.[1]

3. 2. 가상 머신 아키텍처

JVM은 기본 유형(정수, 부동 소수점 등)과 참조 유형의 데이터를 처리한다.[6] 초기 JVM은 32비트 머신이었으나, 최신 JVM (OpenJDK HotSpot JVM)은 64비트를 지원하여 더 큰 주소 공간을 활용할 수 있다. 64비트 환경에서 Java를 실행하면 더 큰 Java 힙 크기와 증가된 최대 Java 스레드 수를 허용하지만, 32비트 JVM에 비해 성능 저하가 발생할 수 있다.

객체와 배열은 가비지 컬렉션 힙에 저장되며, 코드, 상수 등은 메서드 영역에 저장된다. 메서드 영역은 논리적으로 힙의 일부이지만, 구현에 따라 힙과 별도로 처리될 수 있다. 각 JVM 스레드는 자체 호출 스택을 가지며, 메서드 호출 시 프레임이 생성되고 종료 시 파괴된다.

각 프레임은 피연산자 스택과 지역 변수 배열을 포함한다. 피연산자 스택은 계산을 위한 피연산자와 호출된 메서드의 반환 값을 수신하는 데 사용되는 반면, 지역 변수는 레지스터와 같은 목적으로 사용되며 메서드 인수를 전달하는 데에도 사용된다.

3. 3. 바이트코드 명령어

JVM은 로드 및 스토어, 산술 연산, 자료형 변환, 객체 생성 및 조작, 오퍼랜드 스택 관리 (푸시/팝), 제어 전달 (분기), 메서드 호출 및 반환, 예외 발생, 모니터 기반 동시성 등 다양한 작업을 위한 명령어를 제공한다.[32] 이러한 명령어 집합은 특정 명령어 집합 아키텍처의 네이티브 자료형이 아닌 추상화된 DATA_TYPE 집합에서 작동한다.[32]

JVM 명령어는 스택 기반으로 동작하며, 대부분의 명령어는 스택에서 피연산자를 가져와 연산을 수행하고 결과를 다시 스택에 넣는 방식으로 작동한다. 명령어는 수행할 연산의 종류와 피연산자의 타입을 나타내는 코드로 구성된다. 예를 들어, `iadd`는 정수 덧셈을, `fadd`는 단정밀도 부동 소수점 덧셈을 나타낸다.[32]

다음은 바이트코드 명령어의 몇 가지 예시이다.

  • 값을 스택에 푸시:
  • `bipush`, `sipush`: 바이트 값, 쇼트 값을 스택에 푸시한다.
  • `ldc`, `ldc_w`, `ldc2_w`: 상수 풀에서 정수, float, java.lang.String, long, double 값을 스택에 푸시한다.
  • `iconst_m1` ~ `iconst_5`, `lconst_0`, `lconst_1`, `fconst_0` ~ `fconst_2`, `dconst_0`, `dconst_1`: 각각 int, long, float, double 형의 특정 값(-1 ~ 5, 0 또는 1, 0 또는 1 또는 2, 0 또는 1)을 스택에 푸시한다.
  • `aconst_null`: null 값을 스택에 푸시한다.
  • 스택에서 값을 제거/조작:
  • `pop`, `pop2`: 스택에서 1, 2워드를 제거한다.
  • `dup`, `dup2`, `dup_x1`, `dup2_x1`, `dup_x2`, `dup2_x2`: 스택의 값을 복사한다.
  • `swap`: 스택 최상위 두 값을 교환한다.
  • 지역 변수에서 값을 가져오거나 저장:
  • `iload`, `lload`, `fload`, `dload`, `aload`: 지역 변수에서 `int`, `long`, `float`, `double`, 참조 값을 가져와 스택에 푸시한다.
  • `iload_0` ~ `iload_3`, `lload_0` ~ `lload_3`, `fload_0` ~ `fload_3`, `dload_0` ~ `dload_3`, `aload_0` ~ `aload_3`: 0, 1, 2, 3번째 지역 변수 값을 스택에 푸시한다.
  • `istore`, `lstore`, `fstore`, `dstore`, `astore`: `int`, `long`, `float`, `double`, 참조 값을 지역 변수에 저장한다.
  • `istore_0` ~ `istore_3`, `lstore_0` ~ `lstore_3`, `fstore_0` ~ `fstore_3`, `dstore_0` ~ `dstore_3`, `astore_0` ~ `astore_3`: `int`, `long`, `float`, `double`, 참조 값을 0, 1, 2, 3번째 지역 변수에 저장한다.
  • 조건부 분기:
  • `ifeq`, `ifnull`, `iflt`, `ifle`, `ifne`, `ifnonnull`, `ifgt`, `ifge`: 스택 값이 0, `null`, 0 미만, 0 이하, 0 이외, `null` 이외, 0 초과, 0 이상인 경우 지정된 주소로 제어를 이동한다.
  • `if_icmpeq`, `if_icmpne`, `if_icmplt`, `if_icmpgt`, `if_icmple`, `if_icmpge`: 두 `int` 값이 같음, 같지 않음, <, >, ≤, ≥인 경우 지정된 주소로 제어를 이동한다.
  • `if_acmpeq`, `if_acmpne`: 두 참조 값이 같음, 같지 않음인 경우 지정된 주소로 제어를 이동한다.
  • 형 변환:
  • `i2l`, `i2f`, `i2d`, `i2b`, `i2c`, `i2s`: `int` 값을 `long`, `float`, `double`, `byte`, `char`, `short` 값으로 변환한다.
  • `l2i`, `l2f`, `l2d`: `long` 값을 `int`, `float`, `double` 값으로 변환한다.
  • `f2i`, `f2l`, `f2d`: `float` 값을 `int`, `long`, `double` 값으로 변환한다.
  • `d2i`, `d2l`, `d2f`: `double` 값을 `int`, `long`, `float` 값으로 변환한다.
  • 비교 연산:
  • `dcmpg`, `dcmpl`: 두 `double` 값을 비교하여, 큰 경우 `1`, 같은 경우 `0`, 작은 경우 `-1`을 스택에 남긴다.
  • `fcmpg`, `fcmpl`: 두 `float` 값을 비교한다.
  • `lcmp`: 두 `long` 값을 비교한다.
  • 산술 연산:
  • `iadd`, `ladd`, `fadd`, `dadd`: `int`, `long`, `float`, `double` 값에서 스택에서 가져온 첫 번째 값에 두 번째 값을 더하고, 스택에 쌓는다.
  • `isub`, `lsub`, `fsub`, `dsub`: `int`, `long`, `float`, `double` 값에서 스택에서 가져온 첫 번째 값에서 두 번째 값을 빼고, 스택에 쌓는다.
  • `imul`, `lmul`, `fmul`, `dmul`: `int`, `long`, `float`, `double` 값에서 스택에서 가져온 첫 번째 값에 두 번째 값을 곱하고, 스택에 쌓는다.
  • `idiv`, `ldiv`, `fdiv`, `ddiv`: `int`, `long`, `float`, `double` 값에서 스택에서 가져온 첫 번째 값을 두 번째 값으로 나눈 몫을 스택에 쌓는다.
  • `irem`, `lrem`, `frem`, `drem`: `int`, `long`, `float`, `double` 값에서 스택에서 가져온 첫 번째 값을 두 번째 값으로 나눈 나머지를 스택에 쌓는다.
  • `ineg`, `lneg`, `fneg`, `dneg`: `int`, `long`, `float`, `double` 값에서 스택에서 가져온 값의 부호를 반전시킨다.
  • 시프트 및 논리 연산:
  • `ishl`, `lshl`: `int`, `long` 값을 지정한 비트만큼 왼쪽으로 시프트한다.
  • `ishr`, `lshr`: `int`, `long` 값을 지정한 비트만큼 오른쪽으로 산술 시프트한다.
  • `iushr`, `lushr`: `int`, `long` 값을 지정한 비트만큼 오른쪽으로 논리 시프트한다.
  • `iand`, `land`: `int`, `long` 값 2개의 피연산자의 `AND` (비트 단위 논리곱)을 구한다.
  • `ior`, `lor`: `int`, `long` 값 2개의 피연산자의 `OR` (비트 단위 논리합)을 구한다.
  • `ixor`, `lxor`: `int`, `long` 값 2개의 피연산자의 `XOR` (비트 단위 배타적 논리합)을 구한다.
  • 기타:
  • `checkcast`: 참조 값이 가리키는 인스턴스 형식을 확인한다.
  • `instanceof`: 스택에서 참조 값을 제거하고, 그것이 지정된 형식과 같으면 `1`을, 다르면 `0`을 스택에 푸시한다.
  • `iinc`: `int` 값을, 부호 있는 1바이트(값의 범위는 -128~127)로 직접 기술한 상수만큼 증감시킨다.

3. 3. 1. 명령어 목록 (니모닉)

nop01
aconst_null02
iconst_m103
iconst_004
iconst_105
iconst_206
iconst_307
iconst_408
iconst_509
lconst_00A
lconst_10B
fconst_00C
fconst_10D
fconst_20E
dconst_00F
dconst_11-10
bipush11
sipush12
ldc13
ldc_w14
ldc2_w15
iload16
lload17
fload18
dload19
aload1A
iload_01B
iload_11C
iload_21D
iload_31E
lload_01F
lload_12-20
lload_221
lload_322
fload_023
fload_124
fload_225
fload_326
dload_027
dload_128
dload_229
dload_32A
aload_02B
aload_12C
aload_22D
aload_32E
iaload2F
laload3-30
faload31
daload32
aaload33
baload34
caload35
saload36
istore37
lstore38
fstore39
dstore3A
astore3B
istore_03C
istore_13D
istore_23E
istore_33F
lstore_04-40
lstore_141
lstore_242
lstore_343
fstore_044
fstore_145
fstore_246
fstore_347
dstore_048
dstore_149
dstore_24A
dstore_34B
astore_04C
astore_14D
astore_24E
astore_34F
iastore5-50
lastore51
fastore52
dastore53
aastore54
bastore55
castore56
sastore57
pop58
pop259
dup5A
dup_x15B
dup_x25C
dup25D
dup2_x15E
dup2_x25F
swap6-60
iadd61
ladd62
fadd63
dadd64
isub65
lsub66
fsub67
dsub68
imul69
lmul6A
fmul6B
dmul6C
idiv6D
ldiv6E
fdiv6F
ddiv7-70
irem71
lrem72
frem73
drem74
ineg75
lneg76
fneg77
dneg78
ishl79
lshl7A
ishr7B
lshr7C
iushr7D
lushr7E
iand7F
land8-80
ior81
lor82
ixor83
lxor84
iinc85
i2l86
i2f87
i2d88
l2i89
l2f8A
l2d8B
f2i8C
f2l8D
f2d8E
d2i8F
d2l9-90
d2f91
i2b92
i2c93
i2s94
lcmp95
fcmpl96
fcmpg97
dcmpl98
dcmpg99
ifeq9A
ifne9B
iflt9C
ifge9D
ifgt9E
ifle9F
if_icmpeqA-A0
if_icmpneA1
if_icmpltA2
if_icmpgeA3
if_icmpgtA4
if_icmpleA5
if_acmpeqA6
if_acmpneA7
gotoA8
jsrA9
retAA
tableswitchAB
lookupswitchAC
ireturnAD
lreturnAE
freturnAF
dreturnB-B0
areturnB1
returnB2
getstaticB3
putstaticB4
getfieldB5
putfieldB6
invokevirtualB7
invokespecialB8
invokestaticB9
invokeinterfaceBA
invokedynamicBB
newBC
newarrayBD
anewarrayBE
arraylengthBF
athrowC-C0
checkcastC1
instanceofC2
monitorenterC3
monitorexitC4
wideC5
multianewarrayC6
ifnullC7
ifnonnullC8
goto_wC9
jsr_wCA
breakpointCB
정의되지 않음CC
정의되지 않음CD
정의되지 않음CE
정의되지 않음CF
정의되지 않음D-D0
정의되지 않음D1
정의되지 않음D2
정의되지 않음D3
정의되지 않음D4
정의되지 않음D5
정의되지 않음D6
정의되지 않음D7
정의되지 않음D8
정의되지 않음D9
정의되지 않음DA
정의되지 않음DB
정의되지 않음DC
정의되지 않음DD
정의되지 않음DE
정의되지 않음DF
정의되지 않음E-E0
정의되지 않음E1
정의되지 않음E2
정의되지 않음E3
정의되지 않음E4
정의되지 않음E5
정의되지 않음E6
정의되지 않음E7
정의되지 않음E8
정의되지 않음E9
정의되지 않음EA
정의되지 않음EB
정의되지 않음EC
정의되지 않음ED
정의되지 않음EE
정의되지 않음EF
정의되지 않음F-F0
정의되지 않음F1
정의되지 않음F2
정의되지 않음F3
정의되지 않음F4
정의되지 않음F5
정의되지 않음F6
정의되지 않음F7
정의되지 않음F8
정의되지 않음F9
정의되지 않음FA
정의되지 않음FB
정의되지 않음FC
정의되지 않음FD
정의되지 않음FE
impdep1FF
impdep2



각 명령어에 대한 간략한 설명은 다음과 같다.

3. 3. 2. 오퍼코드 해설

JVM 명령어는 스택, 지역 변수, 조건 분기, 점프, 메서드 호출/복귀, 형 변환, 비교 연산, 산술 연산, 논리 연산, 객체 조작, 배열 조작 등 다양한 연산을 수행한다.

3. 4. JVM 언어

JVM 언어는 유효한 클래스 파일로 표현될 수 있고 자바 가상 머신(JVM)에서 실행될 수 있는 모든 언어를 의미한다. 클래스 파일은 자바 바이트코드 명령어와 심볼 테이블, 기타 보조 정보를 포함하며, 하드웨어 및 운영 체제와 독립적인 이진 형식이다.[7]

JVM 언어에는 기존 언어를 JVM으로 이식한 것과 완전히 새로운 언어가 모두 있다. JRuby와 Jython은 루비와 파이썬을 이식한 대표적인 사례이다. 처음부터 자바 바이트코드로 컴파일되도록 만들어진 새로운 언어 중에서는 클로저, 그루비, 스칼라, 코틀린이 가장 많이 사용된다. JVM 언어들은 서로 호환되는 특징을 가지는데, 예를 들어 스칼라 라이브러리를 자바 프로그램에서 사용하거나 그 반대로 사용하는 것이 가능하다.[8]

자바 7 JVM은 ''JSR 292: Supporting Dynamically Typed Languages''[9]를 구현하여 동적으로 형식이 지정된 언어를 지원한다. 이 기능은 JVM이 자바 이외의 언어를 지원하도록 확장하는 것을 목표로 하는 다 빈치 머신 프로젝트 내에서 개발되었다.[10][11]

3. 5. 바이트코드 검증기

JVM은 바이트코드가 실행되기 전에 모든 바이트코드를 검증하여 프로그램의 안전성을 보장한다.[12] 이 과정은 주로 다음 세 가지 유형의 검사로 구성된다.

처음 두 가지 검사는 주로 클래스가 로드되고 사용 가능하게 될 때 수행되는 검증 단계에서 이루어진다. 세 번째 검사는 주로 동적으로, 클래스의 데이터 항목이나 메서드에 다른 클래스가 처음으로 접근할 때 수행된다.[12]

검증기는 유효한 프로그램에서 일부 바이트코드 시퀀스만 허용한다. 예를 들어, 점프(분기) 명령어는 동일한 메서드 내의 명령어만을 대상으로 할 수 있다.[12] 또한, 검증기는 주어진 명령어가 고정된 스택 위치에서 작동하도록 보장하여, JIT 컴파일러가 스택 접근을 고정된 레지스터 접근으로 변환할 수 있도록 돕는다.[12]

바이트코드 검증기에 대한 원래 사양에는 불완전하거나 잘못된 부분이 있었지만, JVM을 형식 시스템으로 지정하려는 노력을 통해 JVM 구현의 보안을 분석하고 잠재적인 보안 취약점을 방지할 수 있게 되었다.[15]

3. 5. 1. 원격 코드의 안전한 실행

가상 머신 아키텍처는 머신 내 코드가 수행할 수 있는 작업에 대해 매우 세분화된 제어를 허용한다. 이는 코드가 "의미적으로" 정확하다는 것을 전제로 하며, 가상 머신 외부의 도구를 통해 구현된 (공식적인) 바이트코드 검증 프로세스를 성공적으로 통과했다는 것을 의미한다. 이는 원격 소스의 신뢰할 수 없는 코드를 안전하게 실행할 수 있도록 설계되었으며, 자바 애플릿 및 기타 안전한 코드 다운로드에서 사용하는 모델이다. 바이트코드가 검증되면 다운로드된 코드는 제한된 "샌드박스"에서 실행되며, 이는 잘못 작동하거나 악성 코드로부터 사용자를 보호하도록 설계되었다. 바이트코드 검증 프로세스에 추가하여 게시자는 애플릿을 안전한 것으로 디지털 서명하는 인증서를 구매하여 사용자가 샌드박스를 벗어나 로컬 파일 시스템, 클립보드에 접근하거나 외부 소프트웨어를 실행하거나 네트워크에 접근하도록 요청할 수 있는 권한을 부여할 수 있다.[16]

3. 6. 바이트코드 인터프리터와 JIT 컴파일러

JVM은 인터프리터를 통해 바이트코드를 실행하거나, JIT 컴파일러를 통해 기계어로 변환하여 실행할 수 있다.[17] JIT 컴파일러는 프로그램을 실행하는 동안 바이트코드를 기계어로 번역하며, 프로그램에서 자주 실행되는 부분을 기계어로 변환하여 실행 속도를 크게 향상시킨다.[18]

각각의 하드웨어 아키텍처에는 서로 다른 Java 바이트코드 인터프리터가 필요하다. 컴퓨터에 Java 바이트코드 인터프리터가 있으면 Java 바이트코드 프로그램을 실행할 수 있으며, 동일한 프로그램은 이러한 인터프리터가 있는 모든 컴퓨터에서 실행할 수 있다. Java 바이트코드가 인터프리터에 의해 실행될 때는 기계어로 컴파일하여 실행하는 것보다 항상 느리지만, JIT 컴파일러를 통해 이 문제를 완화할 수 있다.

핫스팟 가상 머신(HotSpot Virtual Machine영어)과 같은 고성능 가상 머신 구현을 통해 인터프리터 등 이전에는 실용적이지 못했던 언어 구현이 실용적이 되었다.

4. 웹 브라우저에서의 JVM

웹 브라우저에서의 JVM에 대한 별도의 요약은 제공되지 않았습니다. 원본 소스에 웹 브라우저와 JVM 관련 내용이 없으므로, 이 섹션에는 내용을 작성하지 않습니다.

4. 1. 자바 애플릿

초기 자바 플랫폼 시대에는 JVM이 풍부한 웹 애플리케이션(풍부한 웹 애플리케이션)을 만드는 웹 기술로 시장에 출시되었다. 2018년 현재, 대부분의 웹 브라우저와 웹 브라우저를 번들로 제공하는 운영 체제는 자바 플러그인(플러그인)을 제공하지 않으며, 비플래시 플러그인의 사이드 로딩도 허용하지 않는다. 자바 브라우저 플러그인은 JDK 9에서 더 이상 지원되지 않는다.[19]

NPAPI 자바 브라우저 플러그인은 JVM이 HTML 페이지에 포함된 자바 애플릿(자바 애플릿)을 실행할 수 있도록 설계되었다. 플러그인이 설치된 브라우저의 경우, 애플릿은 할당된 페이지의 직사각형 영역에 그릴 수 있다. 플러그인에는 JVM이 포함되어 있으므로 자바 애플릿은 자바 프로그래밍 언어에 제한되지 않는다. JVM을 대상으로 하는 모든 언어가 플러그인에서 실행될 수 있다. 제한된 API 집합을 통해 애플릿은 사용자의 마이크나 3D 가속에 접근할 수 있지만, 애플릿이 직사각형 영역 외부의 페이지를 수정할 수는 없다. 주요 경쟁 기술인 어도비 플래시 플레이어도 이와 같은 방식으로 작동한다.

2015년 6월 W3Techs에 따르면, 자바 애플릿과 마이크로소프트 실버라이트의 사용률은 모든 웹사이트에서 각각 0.1%로 떨어진 반면, 플래시는 10.8%로 떨어졌다.[20]

4. 2. 자바스크립트 JVM과 인터프리터

자바폴리는 사용자들이 수정되지 않은 자바 라이브러리들을 가져와서 자바스크립트로부터 직접 이들을 호출할 수 있게 하고 있다.[21] 자바폴리를 사용하면 사용자의 컴퓨터에 자바가 설치되어 있지 않은 상태에서도 웹사이트들이 수정되지 않은 자바 라이브러리를 실행할 수 있다.[21]

4. 3. 자바스크립트로의 컴파일

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

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

5. 분류

현재 사용되고 있는 자바 가상 머신 규격은 크게 네 가지로 나뉜다. 자바 플랫폼은 자바 SE, 자바 EE, 자바 ME, 자바 카드로 구분되나, 자바 가상 머신 규격은 이 분류와 일치하지 않는다.[38] 자바 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영어이라는 별도 구현을 제공한다.

항목자바 SE자바 EE자바 ME[39]자바 카드
CLDCCDCClassic EditionConnected Edition
개요모든 자바 플랫폼의 기본이 되는 플랫폼으로 자바 가상 머신, 자바 언어 규격 제정의 기준이 된다. 데스크톱 환경 및 서버 환경에서 공히 널리 사용된다.기업 서버 환경에서 사용될 목적으로 제정된 플랫폼으로 자바 SE에 추가 API가 더 정의된 형태이다.저사양 임베디드 시스템을 위한 플랫폼으로 특히 스마트폰이 아닌 피처폰에서 많이 사용된다. 8MHz~32MHz 클럭으로 동작하는 16비트 혹은 32비트 프로세서, 최소 160KB ROM(Flash), 32KB RAM을 목표로 한 플랫폼이다.[40]상대적으로 고사양 임베디드 시스템을 위한 플랫폼으로 디지털 TV나 블루레이 디스크 플레이어에 널리 사용되고 있다. 원래는 스마트폰 같은 고사양 휴대폰에도 CDC를 보급하는 것이 목적이었으나 안드로이드, iOS 위주로 재편된 시장에서는 거의 사용되지 않는다.메모리/CPU가 제약된 스마트카드용 플랫폼으로 목표 환경은 통상 RAM 1.2KB, EEPROM이나 flash 16KB, ROM 32KB~48KB 정도를 가진다.[41]스마트카드의 고사양화에 의해 새로 추가된 플랫폼이다. 최소 환경은 비휘발성 메모리 176KB[42], RAM 16KB를 요구한다. 통상적으로는 ROM 512KB, 읽고 쓸 수 있는 비휘발성 메모리 128KB, RAM 24KB 정도의 환경을 목표로 한다.[41]
JVM 규격[http://java.sun.com/docs/books/jvms/ 자바 가상 머신 규격]에 따르는 VM 규격 사용자바 SE와 동일다음과 같은 부분 집합:[40]
자바 SE와 동일하나 일부 핵심 API만 부분 집합다음과 같은 부분 집합:[41]다음과 같은 부분 집합:[41]
API
주요 구현오라클 HotSpot VM[43], 오라클 JRocket[44] (추후 두 VM을 하나로 통합 예정)Java SE와 차이 없으며 HotSpot VM의 경우 서버용으로 튜닝된 버전이 있음오라클 KVM[45], IBM WEME(WebSphere Everyplace Micro Environment)[46] : 동일한 코드에서 CLDC/CDC 버전을 도출


6. 구현

오라클(구 썬 마이크로시스템즈) 뿐만 아니라 IBM, HP 등 여러 회사에서 JVM을 구현하여 제공하고 있다. 마이크로소프트 윈도우는 과거 자체 JVM을 제공했으나, 썬 마이크로시스템즈와의 계약 위반으로 라이선스를 상실했다.

IKVM.NET, GNU Smalltalk VM 기반 JVM 등 오픈 소스 커뮤니티에서도 다양한 JVM 구현이 시도되고 있다. 아파치 소프트웨어 재단하모니(Harmony)와 같은 오픈 소스 JVM도 존재한다. 썬 마이크로시스템즈는 이러한 공개 소프트웨어 단체의 움직임에 따라 자사의 JVM 및 개발 도구 킷을 오픈 소스 정책에 맞추어 공개했다.

6. 1. JIT 컴파일

초기 JVM 구현(JDK 1.0)은 인터프리터 방식이었기 때문에 다른 응용 프로그램에 비해 실행 속도가 느린 경우가 있었다.[18] 따라서, 메서드 실행 직전(Just in Time)에 바이트코드를 CPU의 네이티브 코드로 컴파일하여 실행하는 방식(JIT 컴파일러)을 보랜드와 IBM 등이 출시했다. 썬 마이크로시스템즈의 구현도 JDK 1.1부터 JIT 컴파일러를 탑재했다.

JDK 1.2부터 썬 마이크로시스템즈는 HotSpot이라는 고속화 기술을 도입했다. HotSpot은 JIT 컴파일러의 일종이지만, 항상 JIT 컴파일을 수행하는 것이 아니라 실행 횟수가 특정 횟수를 초과한 메서드(Hotspot)만 JIT 컴파일한다. 이를 통해 JIT 컴파일로 인한 불필요한 리소스 소모를 방지하고, 인터프리터 실행 시의 프로파일링 정보를 JIT 컴파일에서 활용할 수 있다는 장점이 있다. HotSpot에는 용도에 따라 클라이언트 VM(컴파일은 빠르지만 생성되는 네이티브 코드의 최적화 정도가 상대적으로 낮다)과 서버 VM(컴파일은 느리지만 생성되는 네이티브 코드의 최적화 정도가 상대적으로 높다)이 있다.

6. 2. 스레드

그린 스레드는 JVM 자체에서 가상 스레드를 관리하는 방식으로, pthread 등 OS가 제공하는 스레드 라이브러리를 직접 사용하지 않고 Java로 가상적인 스레드를 만들어 실행하는 방식이다. 현재는 거의 사용되지 않는다.[1] OS가 제공하는 스레드 라이브러리와 Java 스레드가 1:1로 대응되는 방식은 네이티브 스레드라고 한다.[1]

6. 3. 가비지 컬렉션 (GC)

세대별 GC는 힙을 둘 이상의 세대로 나누고, 각 세대에 서로 다른 알고리즘(및 데이터 구조)을 적용하는 방식이다. 복사 가비지 컬렉션, 마크 앤 스윕, 대부분 동시 마크 앤 스윕, 마크 앤 콤팩트 등의 알고리즘이 있다.

참조

[1] 웹사이트 JDK 20 Release Notes https://www.oracle.c[...] 2023-06-24
[2] 서적 Inside the Java Virtual Machine http://www.artima.co[...]
[3] 웹사이트 The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 924 http://www.jcp.org/e[...] Jcp.org 2015-06-26
[4] 웹사이트 The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 202 http://www.jcp.org/e[...] Jcp.org 2015-06-26
[5] 서적 The Java Virtual Machine Specification http://java.sun.com/[...]
[6] 웹사이트 Chapter 2. The Structure of the Java Virtual Machine https://docs.oracle.[...] 2021-09-15
[7] 웹사이트 The Java Virtual Machine Specification : Java SE 7 Edition http://docs.oracle.c[...] Docs.oracle.com 2015-06-26
[8] 웹사이트 Frequently Asked Questions - Java Interoperability http://www.scala-lan[...] 2015-11-18
[9] 웹사이트 The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 292 https://jcp.org/en/j[...] Jcp.org 2015-06-26
[10] 웹사이트 Da Vinci Machine project http://openjdk.java.[...] Openjdk.java.net 2015-06-26
[11] 웹사이트 New JDK 7 Feature: Support for Dynamically Typed Languages in the Java Virtual Machine http://www.oracle.co[...] Oracle.com 2015-06-26
[12] 웹사이트 The Verification process http://java.sun.com/[...] Sun Microsystems 2009-05-31
[13] 웹사이트 HotSpot Runtime Overview - Interpreter https://openjdk.java[...] 2021-05-24
[14] 웹사이트 Why not make CLR register-based? · Issue #4775 · dotnet/runtime https://github.com/d[...] 2021-05-24
[15] 논문 Proceedings of the 14th ACM SIGPLAN conference on object-oriented programming, systems, languages, and applications - OOPSLA '99
[16] 웹사이트 Formal Development of an Embedded Verifier for Java Card Byte Code http://www-sop.inria[...] 2002-04-10
[17] 서적 Introduction to Programming Using Java http://math.hws.edu/[...] 2014-08
[18] 웹사이트 Oracle JRockit Introduction http://docs.oracle.c[...]
[19] 뉴스 Oracle deprecates the Java browser plugin, prepares for its demise https://arstechnica.[...] 2016-01-28
[20] 웹사이트 Historical yearly trends in the usage of client-side programming languages, June 2015 http://w3techs.com/t[...] W3techs.com 2015-06-26
[21] 잡지 JavaPoly.js imports existing Java code and invokes it directly from JavaScript http://www.infoworld[...] 2016-05-13
[22] 웹사이트 TeaVM project home page http://teavm.org/ Teavm.org 2015-06-26
[23] 웹사이트 Dragome Web SDK http://www.dragome.c[...] Dragome.com 2015-06-26
[24] 웹사이트 Bck2Brwsr - APIDesign http://wiki.apidesig[...] Wiki.apidesign.org 2015-06-26
[25] 웹사이트 j2js-compiler https://github.com/d[...]
[26] 웹사이트 List of languages that compile to JS · jashkenas/coffeescript Wiki · GitHub https://github.com/j[...] Github.com 2015-06-19
[27] 웹사이트 smalltalk/packages/java at master · gnu-smalltalk/smalltalk https://github.com/g[...] 2015-02-18
[28] 웹인용 JDK 20 Release Notes https://www.oracle.c[...] 2023-06-24
[29] 인터뷰 제임스 고슬링의 ACM Queue 인터뷰 내용 http://queue.acm.org[...]
[30] 웹인용 UCSD p-코드 머신 구조 https://web.archive.[...] 2010-12-20
[31] 서적 스몰토크 블루북 26장 http://www.mirandaba[...]
[32] 백서 자바 백서 http://java.sun.com/[...]
[33] 가이드 자바 7 다중 언어 지원 가이드 http://download.orac[...]
[34] 웹인용 TeaVM project home page http://teavm.org/ Teavm.org 2015-06-26
[35] 웹인용 Dragome Web SDK http://www.dragome.c[...] Dragome.com 2015-06-26
[36] 웹인용 Bck2Brwsr - APIDesign http://wiki.apidesig[...] Wiki.apidesign.org 2015-06-26
[37] GitHub j2js-compiler https://github.com/d[...]
[38] 웹사이트 자바 가상 머신 규격 http://java.sun.com/[...]
[39] 웹페이지
[40] 웹사이트 CLDC 1.1 JSR 페이지 http://www.jcp.org/e[...]
[41] 웹사이트 자바 카드 3.0.1 규격 다운로드 페이지 http://java.sun.com/[...]
[42] 웹페이지
[43] 웹사이트 HotSpot VM 홈페이지 http://www.oracle.co[...]
[44] 웹사이트 JRocket 홈페이지 http://www.oracle.co[...]
[45] 웹사이트 오라클 모바일 자바 참조 구현 다운로드 페이지 http://www.oracle.co[...]
[46] 웹사이트 WEME 홈페이지 http://www-01.ibm.co[...]
[47] 웹사이트 Java ME for Embedded 문서 페이지 http://www.oracle.co[...]
[48] 웹사이트 JBed 홈페이지 http://www.myriadgro[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com