본문 바로가기
Java

JVM 이란?

by 콧등치기국수 2022. 4. 4.

1. JVM


Java Virtual Machine : 자바를 실행하기 위한 가상 기계

- OS에 종속적이지 않다.

- OS에 종속받지 않고 CPU가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터

 

JVMInterPreterJIT는 bytecode를 OS가 인식할 수 있는 기계어로 변환해준다. 따라서 byteCode는 JVM 위에서 OS 상관없이 실행될 수 있다. 그래서 JVM을 통해 자바가 특정 OS나 플랫폼에 독립적일 수 있다는 것이다.
(JVM은 하드웨어와 OS위에서 실행되기 때문에 JVM 자체는 플랫폼에 종속적 즉, 플랫폼에 따라 호환되는 JVM을 실행시켜줘야 한다.)

자바 실행과정

JVM이 인식할 수 있는 이러한 byteCode는 Java 소스코드, 즉 원시코드(.java)가 아니다.

Java Compiler.java파일을 .class 라는 bytecode로 변환하는 과정을 통해 생성된다.

여기서 Java compiler는 JDK를 설치하면 bin 에 존재하는 javac.exe를 말한다.
(즉, JDK에 Java compiler가 포함되어 있음)
javac 명령어를 통해 .java를 .class로 컴파일 할 수 있다.

 

2. Compile

Java Compiler는 JDK를 설치하면 javac.exe라는 실행파일 형태로 설치된다.

정확히는 JDK의 bin폴더에 javac.exe.로 존재한다.

javac 라는 명령어를 사용하면 .class 파일을 생성할 수 있다.  

 

 

3. 바이트코드

Java bytecodeJVM이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다.

자바 컴파일러에 의해 변환된 코드의 명령어 크기가 1바이트라서 자바 바이트코드라고 불리고 있다.

 

바이트 코드는 다시 실시간 번역기(Interpreter) 또는 JIT 컴파일러에 의해 바이너리 코드로 변환된다

*** 바이너리 코드
바이너리 코드 또는 이진 코드라고 함
컴퓨터가 인식할 수 있는 0과 1로 구성된 이진코드

*** 기계어
0과 1로 이루어진 바이너리 코드
기계어가 이진코드로 이루어졌을 뿐 모든 이진코드가 기계어인 것은 아니다.
기계어는 특정한 언어가 아니라 CPU가 이해하는 명령어 집합이며, CPU 제조사마다 기게어가 다를 수 있다.

CPU가 이해하는 언어는 바이너리 코드, 가상머신(JVM)이 이해하는 코드는 바이트 코드이다. 

 

 

4. JIT 컴파일러(Just-In-Time Compiler)란

JVMbytecode를 기계가 실행할 수 있는 기계어로 변환하는데 2가지 방식을 사용한다.

 

(1) 인터프리터 방식 : 소스코드를 빌드시에 암것도 하지 않다가, 런타임시에 바이트 코드 명령어를 한줄 한줄 읽어가며 변환한다. JVM 안에서 바이트코드는 기본적으로 인터프리터 방식으로 동작한다.

(2) JIT 컴파일러 : 인터프리터의 단점을 보완하기 위해 도입된 방식. 바이트 코드 전체를 컴파일하여 네이티브 코드(기계어)로 변경하고 이후에는 해당 메서드를 더이상 인터프리팅하지 않고 네이티브 코드로 직접 실행하는 방식. 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 네이티브 코드를 실행하는 것이기 때문에 전체적인 실행 속도는 인터프리팅 방식보다 빠르다.

 

기계어(컴파일된 코드)는 캐시에 보관하기 때문에 한 번 컴파일된 코드는 빠르게 수행하게 된다.

물론 JIT 컴파일러가 컴파일하는 과정은 바이트 코드를 인터프리팅하는 것보다 훨씬 오래걸리므로 한 번만 실행되는 코드라면 컴파일 하지 않고 인터프리팅하는 것이 유리하다.

따라서 JIT 컴파일러를 사용하는 JVM들은 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크하고 일정 정도를 넣을때에만 컴파일을 수행한다.

(한 번 컴파일된 바이트코드라도 해당 메서드가 더 이상 자주 불리지 않는다면, 캐시에서 기계어를 덜어내고 다시 인터프리터 모드로 동작한다고 한다.)

 

즉, 자바에선 자바 컴파일러자바 프로그램 코드바이트 코드로 변환한 다음,
실제 바이트 코드를 실행하는 시점에서 자바 가상 머신(JVM, 정확히는 JRE)이 바이트 코드를 JIT 컴파일을 통해 기계어로 변환한다.

 

 

출처 및 참고
1. 전체적인 내용 : https://doozi0316.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80
2. JIT 컴파일러 : https://catch-me-java.tistory.com/11
3. JIT 컴파일러 : https://steady-snail.tistory.com/67