JVM은 Java언어로 작성된 프로글매이 실행되는 환경을 제공하는 가상 머신이다. 플랫폼 독립적인 특성을 제공하며, 메모리 관리와 가비지 컬렉션을 담당한다.
JVM 구조

출처 나무위키
1. 클래스 로더 (Class Loader)
로딩: 클래스 파일(바이트 코드)을 찾아 읽어 들인다.2. Runtime Data Area
3. Execution Engine
가비지 컬렉터(GC) : 프로그램에서 더 이상 참조되지 않는 메모리를 자동으로 식별하고 해제하는 역할을 하는 프로그램의 일부.
JVM의 역할
1. 플랫폼 독립성
한 번 작성하고 어디서든 실행하라라는 철학을 가지고 있다.예시로 Windows에서 개발된 JAVA 프로그램은 동일한 바이트 코드를 사용하여 macOS나 Linux에서 실행될수 있고, x86 아키텍처에서 개발안 애플리케이션은 ARM 아키텍처에서도 동작을 한다.
바이트 코드란 원래 프로그래밍을 할때 소스를 만들고 그 소스가 기계어로 변환되어 우리들의 OS에 맞게 실행이 되는데, JAVA에서는 Java 컴파일러가 소스 코드를 중간 언어인 바이트코드로 변환하고, JVM에서 바이트코드를 읽어서 그 코드를 다시 우리가 사용하는 어떤 OS(mac, window, linux)등의 기계어로 변환을 해준다.
Java 컴파일러 : Java 소스를 바이트 코드로 변환하고, 소스코드를 한 번만 컴파일 하고, 그 결과물인 바이트코드는 다양한 플랫폼에서 실행될 수 있다.
컴파일이 되면 .class 확장자를 가진 바이너리 형식의 파일로 저장되고, 만약 소스 코드를 수정하게 되면 재생성이 된다.
JIT(Just-In-Time) 컴파일러 : JVM에서 JIT컴파일러를 사용해서 바이트코드를 기계어로 변환해준다. 인터프리터 방식의 단점을 보안하기 위해 도입되었다.
인터프리터 방식 : 소스 코드를 한줄이 분석해서 기계어로 번역해주는 방식.
2. 메모리 영역
프로그램이 실행되는 동안 메모리를 여러 영역으로 나누어 관리한다.
1. 메서드 영역(Method Area)
2. 힙(Heap)
3. 스택(Stack)
4. PC 레지스터(Program Counter Register)
5. 네이티브 메서드 스택(Native Method Stack)
프로세스 : 운영 체제로 부터 할당받은 자원과 메모리 공간을 갖고 독립적으로 실행되는 프로그램단위. Ex) 계산기 프로세스
스레드 : 프로세스 내에서 실행되는 경량의 실행 단위. Ex) 더하기, 빼기, 나누기