- JVM은 'Java Virtual Machine'을 줄인 것으로 직역하면 '자바를 실행하기 위한 가상 기계'라고 할 수 있다.
- 영어권에서는 컴퓨터를 머신(machine)이라고도 부르기 때문에 '머신'이라는 용어대신 '컴퓨터'를 사용해서 '자바를 실행하기 위한 가상 컴퓨터'라고 할 수 있다.
- Virtual Machine(가상 기계)는 소프트웨어로 구현된 하드웨어를 뜻하는 넓은 의미의 용어이며, 컴퓨터의 성능이 향상됨에 따라 점점 더 많은 하드웨어들이 소프트웨어화되어 컴퓨터 속으로 들어오고 있는데, 마찬가지로 '가상 컴퓨터(virtual computer)'는 실제 컴퓨터(하드웨어)가 아닌 소프트웨어로 구현된 컴퓨터라는 뜻으로 컴퓨터 속의 컴퓨터이다.
- 자바로 작성된 애플리케이션은 모두 이 가상 컴퓨터(JVM)에서만 실행되기 때문에, 자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요하다.
- 운영체제는 자바 프로그램을 바로 실행할 수 없는데, 그 이유는 자바 프로그램은 완전한 기계어가 아닌, 중간 단계의 바이트 코드이기 때문에 이것을 해석하고 실행할 수 있는 가상의 운영체제, JVM(Java Virtual Machine)이 필요하다.
- JVM은 실 운영체제를 대신해서 자바 프로그램을 실행하는 가상의 운영체제 역할을 한다.
- 운영체제별로 프로그램을 실행하고 관리하는 방법이 다르기 때문에 운영체제별로 자바 프로그램을 별도로 개발하는 것보다는 운영체제와 자바 프로그램을 중계하는 JVM을 두어 자바 프로그램이 여러 운영체제에서 동일한 실행 결과가 나오도록 설계한 것이다. 따라서 개발자는 운영체제와 상관없이 자바 프로그램을 개발할 수 있다.
- 일반 애플리케이션의 코드는 OS만 거치고 하드웨어로 전달되는데 비해 자바 애플리케이션은 JVM을 한 번 더 거치기 때문에, 그리고 하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행 시에 해석(interpret)되기 때문에 속도가 느리다는 단점을 가지고 있다.
- 그러나 요즘엔 바이트코드(컴파일된 자바코드)를 하드웨어의 기계어로 바로 변환해주는 JIT컴파일러와 향상된 최적화 기술이 적용되어서 속도의 격차를 많이 줄였다.
- 위 그림에서 볼 수 있듯이 일반 애플리케이션은 운영체제(OS)와 바로 맞 붙어 있기 때문에 OS 종속적이다. 그래서 다른 OS에서 실행시키기 위해서는 애플리케이션을 해당 OS에 맞게 변경해야한다.
- 반면에 자바 애플리케이션은 JVM하고만 상호작용을 하기 때문에 운영체제와 하드웨어에 독립적이라 다른 OS에서도 프로그램의 변경없이 실행이 가능하다.
- 단, JVM은 OS에 종속적이기 때문에 해당 운영체제(OS)에서 실행 가능한 JVM이 필요하다.
- 바이트 코드는 모든 JVM에서 동일한 실행 결과를 보장하지만, JVM은 OS(운영체제)에 종속적이다.
- 자바 프로그램을 운영체제가 이해하는 기계어로 번역해서 실행해야 하므로 JVM은 운영체제에 맞게 설치되어야 한다.
- JVM은 JDK 또는 JRE를 설치하면 자동으로 설치되는데, JDK와 JRE가 운영체제 별로 제공된다.
- 자바 프로그램은 확장자가 .java인 파일을 작성하는 것부터 시작된다. 이것을 소스 파일이라고 하는데, 이 소스파일을 컴파일러(java.exe)로 컴파일하면 확장자가 .class인 바이트 코드 파일이 생성된다.
- 바이트 코드 파일은 JVM 구동 명령어(java.exe)에 의해 JVM에서 해석되고 해당 운영체제에 맞게 기계어로 번역된다.
- 바이트 코드는 하나지만, JVM에 의해서 번역되는 기계어는 운영체제 따라서 달라진다.
- 자바의 가장 큰 장점 중의 하나는 한 번 작성하면 어디서든 실행된다는 것이지만, 한 번의 컴파일링으로 실행 가능한 기계어가 만들어지지 않고 JVM에 의해 기계어로 번역되고 실행되기 때문에 , C와 C++의 컴파일 단계에서 만들어지는 완전한 기계어보다는 속도가 느리다는 단점을 가지고 있다.
- 그러나 기계어로 빠르게 변환해주는 JVM 내부의 최적화된 JIT 컴파일러를 통해서 속도의 격차가 많이 줄어들고 있다.
'Java > Basic' 카테고리의 다른 글
[Java] 변수(Variable) (0) | 2020.03.14 |
---|---|
[Java] 클래스(Class)와 객체(Object) (0) | 2020.03.10 |
[Java] 람다식(Lambda Expressions) (0) | 2020.02.29 |
[Java] 제네릭(Generic) (0) | 2020.01.19 |
[Java] 멀티스레드(Multi Thread) (1) | 2020.01.06 |