JVM이란 무엇인가?
Java Virtual Machine의 줄임말
직역하면 '자바를 실행하기 위한 가상 기계(컴퓨터)'라고 할 수 있다.
Java 는 OS에 종속적이지 않다는 특징을 가지고 있다. OS에 종속받지 않고 실행되기 위해선 OS 위에서 Java 를 실행시킬 무언가가 필요하다. 그게 바로 JVM이다.

OS란 사용자에게 편리한 인터페이스 환경을 제공하고 컴퓨터 시스템의 자원을 효율적으로 관리하는 소프트웨어. 컴퓨터나 노트북의 전원을 켜며 바로 나오는 소프트웨어를 말함
<윈도우, Mac OS , 유닉스, 리눅스, IOS, 안드로이드 등이 있음 >
따라서 개발자는 한 번만 프로그램을 작성하면, 모든 운영체제에서 같이 사용할 수 있는 장점이 있습니다
단, 자바 프로그램과는 달리 자바 가상 머신(JVM)은 운영체제에 종속적이므로, 각 운영체제에 맞는 자바 가상 머신을 설치해야 합니다.또한, 자바 프로그램은 일반 프로그램보다 자바 가상 머신이라는 한 단계를 더 거쳐야 하므로, 상대적으로 실행 속도가 느리다는 단점을 가지고 있습니다.
자바 가상 머신의 구성
자바 인터프리터(interpreter)
클래스 로더(class loader)
JIT 컴파일러(Just-In-Time compiler)
가비지 컬렉터(garbage collector)
JIT 컴파일러(Just-In-Time compiler)란 프로그램이 실행 중인 런타임에 실제 기계어로 변환해 주는 컴파일러를 의미합니다.
동적 번역(dynamic translation)이라고도 불리는 이 기법은 프로그램의 실행 속도를 향상시키기 위해 개발되었습니다.
즉, JIT 컴파일러는 자바 컴파일러가 생성한 자바 바이트 코드를 런타임에 바로 기계어로 변환하 는 데 사용합니다.
자바 가상 머신은 가비지 컬렉터(garbage collector)를 이용하여 더는 사용하지 않는 메모리를 자동으로 회수해 줍니다.
JAVA COMPILER란 무엇인가

자바 컴파일러는 자바를 가지고 작성한 자바 소스 코드를 자바 가상 머신이 이해할 수 있는 자바 바이트 코드로 변환합니다.
자바 컴파일러는 자바를 설치하면 javac.exe라는 실행 파일 형태로 설치됩니다.
자바 바이트 코드(Java bytecode)
프로그램이 실행되면 JVM은 OS로부터 메모리를 할당받는다.
자바 컴파일러가 자바 소스코드(.java)를 읽어 자바 바이트 코드(.class)로 번역한다.
클래스 로더(Class Loader)를 이용해 자바 바이트 코드를 JVM으로 로딩한다.
로딩된 자바 바이트 코드를 실행 엔진(Execution Engine)을 이용해 실행한다.
JIT컴파일러란?
JIT 컴파일러(Just-In-Time) - JIT컴파일러는 인터프리터의 단점을 보완해줍니다. 실행엔진은 바이트코드를 변환하는데에 인터프리터의 도움을 받을테지만 반복되는 코드가 발견되었을 시에는 JIT컴파일러를 사용해서 반복되는 부분을 native code(원시코드)로 컴파일합니다. 변환된 원시코드는 인터프리터의 변환과정없이 직접적으로 사용이 가능하며(기존에는 바이트코드에서 원시코드로 변환 후 실행하였다면 JIT 컴파일러를 사용하여 변환된 원시코드는 변환하지않고 바로 실행) 이로 인해 시스템의 성능이 좋아지게 된다.
인터프리터(Interpreter) - 인터프리터는 바이트코드를 빠르게 해석하지만 실행속도는 느립니다.(한줄씩) 인터프리터의 단점은 하나의 메소드가 여러번 호출되었을 때, 매번 새로운 해석(interpretation)이 필요하다는 것입니다.
JIT 컴파일러 역할
1. Intermediate Code 생성기 - Intermediate Code를 생성
2. 코드 최적화 - Intermediate Code를 최적화함.
3. 타겟 코드 생성 - 원시코드(native code) 생성
4. 프로파일 - 특정 메소드가 여러번 실행했는지 안했는지를 판별해주는 special component.