JVM, JRE, JDK

김성혁·2021년 2월 22일
0

JVM(Java Virtual Machine)

  • 자바 가상 머신의 줄임말로 자바 프로그램 등을 컴파일하여 만들어진 바이트 코드를 실행해주는 가상 머신
  • 자바는 프로그램의 수정없이 어떠한 운영체제에서도 동일한 형태로 실행 가능
    • "한 번 쓰고 모든 곳에서 실행한다(Write Once, Run Anywhere, WORA)"
    • 프로그램 메모리를 관리하고 최적화하는 것

가비지 컬렉션(Garbage Collection)
자바 이전에는 프로그래머가 모든 프로그램 메모리를 관리했었다. 자바에서는 JVM이 프로그램 메모리를 관리한다. JVM은 가비지 컬렉션이란 프로세스를 통해 메모리를 관리하며, 이 가비지 컬렉션은 자바 프로그램에서 사용되지 않는 메모리를 지속적으로 찾아내서 제거한다. 가비지 컬렉션은 실행 중인 JVM 내부에서 일어난다.
초창기에, 자바는 C++만큼 "메탈에 가깝지 않아 C++처럼 빠르지 않다"는 면에서 많은 비평을 받았다. 특히 가비지 컬렉션 프로세스가 논쟁이 되었다. 그 이후, 가비지 컬렉션을 위해 다양한 알고리즘과 접근방식이 제안되고 사용되었다. 일관성 있는 개발과 최적화를 통해 가비지 컬렉션은 크게 개선되었다.

개발자가 하는 것보다 JVM 같은 정제된 프로세스에 메모리 관리를 위임함으로써 더 높은 성능과 더 적은 오류를 도출할 수 있다.

  • 자바 애플리케이션을 실행하기 위해 JVM은 자바 클래스 로더(Class Loader)와 자바 실행 엔진(Execution Engine)에 의존
    - 자바 애플리케이션을 실행하기 위해서는, JVM이 컴파일된 .class 파일을 맥락에 따라 액세스 가능한 서버 같은 것으로 로드 해야만 한다. JVM은 클래스 로더에 의존해 이 기능을 수행한다. 자바 클래스 로더는 클래스를 메모리에 로드하고 실행을 위해 사용할 수 있게 만드는 JVM의 일부이다. 클래스 로더는 클래스 로딩(Class Loading)을 최대한 효율적으로 수행하기 위해 지연 로딩(Lazy-loading)과 캐싱(Caching) 같은 기법을 활용한다.
    - 클래스 로더가 클래스를 로딩하는 작업을 마치면, JVM은 각 클래스에 있는 코드를 실행하기 시작한다. 이 기능을 처리하는 것이 JVM 구성요소인 실행 엔진이다. 코드 실행에는 시스템 리소스에 대한 액세스 관리가 관련되어 있다. JVM 실행 엔진은–파일, 네트워크 그리고 메모리 리소스를 요구하는–프로그램 실행과 운영체제 가운데 위치해서 이런 리소스들을 공급한다.

JRE(Java Runtime Environment)

  • 자바용 런타임 환경인 JRE에는 자바 클래스 라이브러리(Java class libraries)와 자바 클래스 로더(Java class loader), 자바 가상 머신(Java Virtual Machine)이 포함된다.
  • 런타임 환경은 프로그램 실행을 위해 클래스 파일을 로드하고 메모리 및 기타 시스템 리소스에 대한 액세스를 확보한다.
  • 자바 런타임 환경은 컴퓨터 운영체제 위에서 실행되면서 자바를 위한 부가적인 서비스를 제공하는 소프트웨어 계층
  • JRE는 자바 코드를 받아서 필요한 라이브러리와 결합한 다음 이 코드를 실행할 JVM을 시작하는 온디스크 시스템

자바 클래스 로더는 자바 런타임 환경의 일부다. 이 중요한 소프트웨어는 컴파일된 자바 코드를 메모리로 로드하고 적절한 자바 클래스 라이브러리에 이 코드를 연결

자바 메모리는 힙(Heap), 스택(Stack), 메타스페이스(Metaspace, 과거에는 펌젠(permgen)이라고 했음)의 세 가지 구성 요소로 이뤄진다.

  • 메타스페이스는 자바가 클래스 정의와 같이 프로그램에서 변화하지 않는 정보를 저장하는 장소
    • 자바 8부터는 프로그램의 메타 수요에 따라 자바가 자동으로 메타스페이스의 크기를 늘린다. 또한 자바 8에는 메타스페이스 크기를 제한하는 데 사용할 수 있는 새로운 플래그, MaxMetaspaceSize가 도입
  • 힙 공간은 자바가 변수 내용을 저장하는 장소 (이상적인 구성은 가장 효율적인 가비지 수집을 달성할 만큼의 힙 크기다. 즉, 프로그램을 실행하기에 충분한 메모리를 허용하되 필요 이상으로 커지지 않도록 하는 것이다.)
  • 스택 공간은 자바가 함수 실행 및 변수 참조를 저장하는 장소

JDK(Java Development Kit)

  • JDK는 자바 애플리케이션 구동에 이용되는 환경이 JRE뿐만 아니라, 자바 컴파일러도 포함

JDK와 JRE의 다른 점

  • JDK가 자바 기반 소프트웨어를 개발하기 위한 도구들로 이뤄진 패키지인 반면, JRE는 자바 코드를 실행하기 위한 도구들로 구성된 패키지라는 점
    • JRE는 단지 자바 프로그램을 구동하기 위한 독립형 구성요소로써 사용될 수도 있지만, 동시에 JDK의 일부이기도 하다. 자바 프로그램을 구동하는 것이 자바 프로그램 개발의 일환이기 때문에 JDK는 JRE를 필요로 한다.

Reference.

"JVM이란 무엇인가" 자바 가상 머신 이해하기 - ITWorld Korea

"JRE란 무엇인가", 자바 런타임 환경의 이해 - ITWorld Korea

"JDK란 무엇인가" 자바 개발 키트 소개와 설치하기 - ITWorld Korea

0개의 댓글