- JVM이란 무엇인가?
Java Virtual Machine의 약자로 컴파일된 Java byte code를 각각의 운영체제에 맞게 해석하여 실행하는 역할을 수행한다. 타 언어는 운영체제에 종속되어 각 운영체제에 맞춰 코드를 리팩토링 해줘야 실행 가능하지만 자바는 JVM만 있으면 어떤 os여도 실행가능하다.
- 컴파일 하는 방법
코드를 해석하는 방식에는 컴파일러 언어와 인터프리터 언어가 있다. 컴파일언어는 코드를 읽고 해석하여 전체 소스코드를 기계어로 바꾸어 파일(빌드 과정에서 모든 소스코드에 대한 분석과 기계어 변환이 이루어진 후 런타임에 빌드타임 때 생성한 모든 기계어를 한 번에 기계로 보내는 것이다.)을 생성한다. 따라서 빌드과정은 오래 걸리지만 실행시 기계어를 바로 읽기만 하면 되서 실행이 빠르다. 반면에 인터프리터 언어는 실행과 동시에 한줄한줄 해석하는 동시통역과 같은 언어이다. 따라서 실행속도가 느리다는 단점이 있다.
자바의 컴파일은 javac.exe라는 컴파일러가 JVM이 이해할 수 있게 바이트 코드로 변환시켜 주고, 프로그램을 실행하면 JVM이 이 바이트 코드를 기계어로 변환시켜 실행한다.
- 바이트 코드란?
플랫폼에 대한 종속이 없는 virtual dom 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법이다.
- JIT 컴파일러란 무엇이며 어떻게 동작하는가?
Just-In-Time compilation(JIT)란 프로그램을 실행하는 시점에서 기계어로 번역하는 컴파일 기법이다. 인터프리터는 빌드 타입에 아무일도 하지 않다가 런타임에 한줄씩 번역한다면 JIT는 빌드 타임에 중간언어로 변환 후 (자바의 경우 바이트 코드 변환) 런타임 때 중간언어를 기계어로 변환하여 기계로 보낸다. 컴파일 방식과 인터프리터 방식을 혼합한 느낌이다. 인터프리터에 비해 한번 최적화 과정을 거침으로 성능이 좀 더 빠른듯 하다. 또한 플랫폼에 맞게 수정해야 하는 컴파일 방식의 단점을 보완해 준다.
- JVM 구성요소
ClassLoader: 컴파일 한 클래스 파일을 런타임에 로딩하는 역할을 수행
Runtime Data Area: JVM이 프로그램을 수행하기 위해 운영체제로 부터 할당 받는 메모리
Execution Engine: JVM에서 생성된 바이트 코드들은 Runtime Data Area에 배치되고 이를 실행하는 엔진(JIT방식으로 수행한다.)
Garbage Collector: 아래 참고
https://d2.naver.com/helloworld/1329
- JDK와 JRE의 차이
JRE(Java Runtime Environment)는 실행을 위한 환경을 모은 패키지이고 JDK(Java Development Kit) 개발을 위한 패키지이다.