JVM 이란?

정의
- 기술적 정의: JVM은 코드를 실행하고 해당 코드에 대해 런타임 환경을 제공하는 소프트웨어 프로그램에 대한 사양(Specification)이다.
- 일반적 정의: JVM은 자바 프로그램을 실행하는 방법이다. JVM의 설정을 구성한 다음 설정사항에 따라 실행 중에 프로그램 리소스를 관리한다.
크게 2가지 역할을 한다.
- 자바가 운영체제의 종류에 영향받지 않고 작동되도록 한다.
- 메모리 관리를 자동으로 해준다.(GC)

자바 애플리케이션이 실행될 때 JVM에서 일어나는 과정은 아래와 같다.
- Java Compiler가
.java
파일을 Java Byte code로 변환한다.
- **Class Loader(클래스 로더)**가 이 변환된 Byte code(.class) 파일을 JVM 내로 class를 로드하고, Link 작업을 통해 엮는다. 그리고 이를 Runtime Data Area로 적재하는 역할을 한다. 자바 애플리케이션이 실행 중일 때 이런 작업이 수행된다.
- **Execution Engine(실행 엔진)**은 Class Loader를 통해 JVM 내부로 넘어와 Runtime Data Area(JVM 메모리)에 배치된 Byte code들을 명령어 단위로 실행시킨다.
- 명령어를 하나하나 실행하는 인터프리터(Interpreter) 방식이 있고, JIT(Just-In-Time) 컴파일러를 이용하는 방식이 있다.
- **GC(Garbage collector)**는 어플리케이션이 생성한 객체의 생존 여부를 판단하여, 더 이상 참조되지 않거나 null인 객체의 메모리를 해체시켜 메모리 반납을 한다.
- GC가 역할 하는 시간은 정확히 언제인지 알 수 없다. (참조가 없어지자마자 해제되는 것을 보장하지 않음)
- GC가 수행되는 동안에는 GC를 수행하는 쓰레드가 아닌 모든 쓰레드가 일시정지된다.