JDK와 JVM이란?

김수빈·2025년 6월 16일

JDK(Java Development Kit)란?

JDK란 자바 프로그램 개발을 위한 핵심 도구와 라이브러리를 포함하는 소프트웨어 개발 키트이다.
이 안에는 프로그램 실행에 필요한 환경인 JRE(Java Runtime Environment)도 포함되어 있다.

JRE란?
자바 애플리케이션을 실행하기 위한 환경으로, JVM과 자바 기본 라이브러리로 구성되어 있다. 자바 프로그램을 실행할 수 있도록 필요한 환경을 제공한다.

JDK 구성 요소

  • apt : 어노테이션 툴
  • appletviewer : 웹브라우저 없이 자바 애플릿을 실행하고 디버깅하기 위한 툴
  • javac : 자바 컴파일러
  • java : 컴파일된 클래스 파일을 JVM을 통해 실행하는 명령어
  • jar : 서로 관련있는 클래스 라이브러리들과 리소스를 하나의 파일로 묶어주는 툴
  • jdb : 자바 디버깅 툴

JDK 종류

  • Java SE(Java Standard Edition) : 표준 자바 플랫폼으로 표준적인 컴퓨팅 환경을 지원하기 위한 자바 가상머신 규격 및 API 집합을 포함한다.
  • java EE(Java Enterprise Edition) : Javs SE에 웹 애플리케이션 서버에서 동작하는 기능을 추가한 플랫폼. 즉, 서버 측 개발을 하기 위해 필요하다. 기업용 애플리케이션(JSP, Servlet, JDBC 등) 기업용 애플리케이션을 개발하는데 필요한 다양한 것들이 포함된 플랫폼, 이 스팩에 따라 제품을 구현한 것을 WAS라고 한다.

    WAS란?
    돟적인 웹 콘텐츠를 처리하기 위해 만들어진 애플리케이션 서버.
    클라이언트의 요청을 받아 DB를 조회하거나 비즈니스 로직을 처리하고, 결과를 웹 서버로 전달하는 역할을 한다.

  • Java ME(Java Micro Edition) : 임베디드 기기들에서 구동되기 위한 환경을 제공하는 API를 모아둔 플랫폼, 제한된 자원을 가진 휴대전화, PDA 등에서 Java 프로그래밍 언어를 지원하기 위해 만든 플랫폼 중 하나이다.

JVM(Java Virtual Machine)이란?

JVM이란 OS에 종속받지 않고 CPU가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터이다. 자바 프로그램은 JVM이라는 가상 머신 위에서 실행되며, 이를 통해 운영체제에 관계없이 동일하게 동작할 수 있다.

JVM의 역할

  • 바이트코드 실행 : 컴파일된 .class 파일을 읽고 실행

    바이트코드(ByteCode)란?
    가상 컴퓨터(VM)에서 돌아가는 실행 프로그램을 위한 이진 표현법

  • 메모리 관리 : 프로그램 실행에 필요한 메모리 공간을 할당하고 해제
  • 가비지 컬렉션(GC) : 사용이 끝난 객체의 메모리를 자동으로 정리하여 메모리 누수를 방지한다.
  • 운영체제 독립성 : 같은 바이트코드가 어떤 OS에서든 동작하도록 가상 머신 환경을 제공한다.

JVM 구조와 작동 원리

  • 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 : 자바 프로그램을 개발하고 실행할 수 있는 도구 모음으로, 컴파일러, 실행기, 라이브러리, JRE를 포함한다.
  • JVM : 자바 프로그램의 바이트코드를 실행하는 가상 머신으로, OS에 독립적인 실행 환경을 제공한다.

JDK와 JVM은 각자 다른 역할을 하지만, 자바 프로그램이 개발부터 실행까지 완성되는 과정에서 서로 꼭 맞물려 움직인다. JDK로 코드를 작성하고 컴파일한 결과물을 JVM이 실행하는 구조 덕분에 자바 프로그램은 다양한 환경에서 동일하게 동작할 수 있다.

지금까지 자바 프로그램을 개발하고 실행할 때 꼭 알아야 하는 JDK, JRE, JVM에 대해 정리해보았다. 처음엔 복잡해 보여도 각각 어떤 역할을 하는지 흐름만 잘 이해하면 어렵지 않았다!

0개의 댓글