JDK란 자바 프로그램 개발을 위한 핵심 도구와 라이브러리를 포함하는 소프트웨어 개발 키트이다.
이 안에는 프로그램 실행에 필요한 환경인 JRE(Java Runtime Environment)도 포함되어 있다.
JRE란?
자바 애플리케이션을 실행하기 위한 환경으로, JVM과 자바 기본 라이브러리로 구성되어 있다. 자바 프로그램을 실행할 수 있도록 필요한 환경을 제공한다.
WAS란?
돟적인 웹 콘텐츠를 처리하기 위해 만들어진 애플리케이션 서버.
클라이언트의 요청을 받아 DB를 조회하거나 비즈니스 로직을 처리하고, 결과를 웹 서버로 전달하는 역할을 한다.
JVM이란 OS에 종속받지 않고 CPU가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터이다. 자바 프로그램은 JVM이라는 가상 머신 위에서 실행되며, 이를 통해 운영체제에 관계없이 동일하게 동작할 수 있다.
바이트코드(ByteCode)란?
가상 컴퓨터(VM)에서 돌아가는 실행 프로그램을 위한 이진 표현법

Class Loader : JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다. 런 타임시 동적으로 클래스를 로드하고 jar 파일 내 저장된 클래스들을 JVM 위에 탑재한다. 즉, 클래스를 처음으로 참조할 때, 해당 클래스를 로드하고 링크하는 역할을 한다.
Execution Engine : 자바 바이트코드를 기계어로 변환해 실행한다. 이때 JIT(Just-In-Time) 컴파일러를 통해 자주 실행되는 코드를 기계어로 변환해 성능을 최적화한다.
JIT 컴파일러란?
자주 실행되는 바이트코드를 프로그램 실행 도중에 한꺼번에 기계어로 변환하여 실행 속도를 높여주는 기능이다.
GC : 메모리 관리 기법 중 하나로, 더 이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제한다.
Runtime Data Area : 프로그램을 수행하기 위해 OS로부터 할당받은 메모리 영역이다.

PC Register
: 스레드가 시작될 때 생성되며 스레드마다 하나씩 존재하는 공간으로, 스레드가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행 중인 JVM 명령의 주소를 갖는다.
JVM Stack
: 프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역이다. 각종 형태의 변수나 데이터, 메소드 호출 정보와 지역 변수를 저장한다.
Native Method Stack
: 자바 프로그램이 컴파일되어 생성되는 바이트코드가 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역, Java가 아닌 네이티브 언어로 작성된 코드를 실행하기 위한 공간이다.
Method Area
: 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간이다.
Runtime Constant Pool
: 스태틱 영역에 존재하는 별도의 관리영역, 상수 자료형을 저장하여 참조하고 중복을 막는 역할을 수행한다.
Heap
: GC의 대상이 되는 영역으로, 동적으로 생성된 객체들이 저장된다. 인스턴스는 Heap 메모리에 할당되고, 그 참조 값(주소)이 변수에 저장된다.
JDK와 JVM은 각자 다른 역할을 하지만, 자바 프로그램이 개발부터 실행까지 완성되는 과정에서 서로 꼭 맞물려 움직인다. JDK로 코드를 작성하고 컴파일한 결과물을 JVM이 실행하는 구조 덕분에 자바 프로그램은 다양한 환경에서 동일하게 동작할 수 있다.
지금까지 자바 프로그램을 개발하고 실행할 때 꼭 알아야 하는 JDK, JRE, JVM에 대해 정리해보았다. 처음엔 복잡해 보여도 각각 어떤 역할을 하는지 흐름만 잘 이해하면 어렵지 않았다!