본 포스팅은 백기선님의 자바 스터디의 과제입니다.
Java Virtual Machine의 줄임말 이며 '자바를 실행하기 위한 가상 컴퓨터'이다.
Java Byte Code를 OS에 맞게 해석 해주는 역할을 합니다.
일반적인 애플리케이션은 OS종속적이라서, OS에 맞게 변경해야 하는 번거로움이 있다. 하지만, Java 애플리케이션은 JVM하고만 상호작용 하기 때문에 OS와 하드웨어에 독립적이라 다른 OS에서도 프로그램의 변경없이 실행이 가능하다.
javac Hello.java
java Hello
바이트코드의 정의는 다음과 같다.
바이트코드(Bytecode)는 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법이다. 하드웨어가 아닌 소프트웨어에 의해 처리되기 때문에, 보통 기계어보다 더 추상적이다.
즉, Java에서 바이트코드는, Java Source Code를 Complie하여 생성된 JVM이 이해할 수 있는 언어이다. Java Byte Code 확장자는 .class
이다.
JIT 컴파일러는 Just-In-Time 컴파일러의 줄임말로, 동적 번역이라고도 한다.
JIT 컴파일러가 등장하게 된 배경을 알아보자.
두 가지 프로그래밍 언어의 실행 방식에 대한 이해가 필요하다.
컴파일 방식 : 소스코드를 한번에 읽을 수 있도록 변환된 Native Machine Code(기계어)를 실행하는 방식. 실행 속도는 빠르지만, 기계어를 생성하는 빌드에 시간이 소요된다. (ex) C/C++)
인터프리터 방식 : 런타임(실행 시점)에 한줄씩 읽어 들이면서 프로그램을 실행하는 방식. 실행 속도는 느리지만, 빌드 시간이 없다. (ex)python)
Java는 두 가지 방식을 혼합한 하이브리드 방식을 사용한다. 컴파일 결과물인 바이트 코드를 JVM이 읽어들인 뒤, 기계어로 해석하여 프로그램이 실행되는데 이때 인터프리터 방식의 단점을 보완하고자 JIT 컴파일러를 사용했다.
복잡하고 다양한 연산을 하면서 반복적으로 호출되는 메소드들을 JIT의 코드 캐시에 저장하기 때문에 더 빠르게 호출하여 성능 향상을 기했다.
자바의 실행 과정은 다음과 같다. Class Loader가 컴파일 된 자바 바이트코드를 Runtime Data Area에 로드하고, Execution Engine이 자바 바이트코드를 실행한다.
자바 컴파일러가 .java 파일을 컴파일하여 생성된 .class(바이트코드)들을 엮어 Runtime Data Area 형태로 메모리에 적재하는 역할을 한다.
메모리에 적재된 클래스들을 기계어로 변환해 명령어 단위로 실행하는 역할을 한다. 이때, 인터프리터 방식과 JIT 방식을 사용한다.
더 이상 사용하지 않는 메모리를 자동으로 회수하여 개발자가 따로 메모리를 관리해야 하는 어려움을 없앤다. 정확히는 힙 영역에 생성된 객체들 중에 참조되지 않는 객체들을 메모리에서 제거하는 것이다.
자바 개발 도구. 자바를 통해 프로그램을 개발할 때 사용되는 모듈(라이브러리)들이 포함된 설치 버전이다. 기본적으로 자바 프로그램을 실행하기 위한 JRE를 포함하고 있으며, 그 외에 빌드 디버깅에 필요한 모듈을 보유하고 있다.
자바 실행 환경. 자바로 작성/빌드 된 프로그램을 실행시키기 위한 모듈이 모여있는 설치 버전으로, 자바 프로그램을 위한 최소 단위의 모듈이다.