JDK, JRE를 공부하다가 JVM이라는 용어가 많이 나와 공부한 결과를 글로 남긴다.
JVM이란?
Java Virtual Machine의 약자로 말 그대로 "자바 가상 머신"이며, 다른 프로그램을 실행시키는 것이 목적인 프로그램이다.
(가상 머신이란 어떠한 프로그램을 실행하기 위한 물리적인 환경, 즉, 하드웨어를 소프트웨어로 구현한 것이다)
JVM의 주요 기능은 시스템 메모리를 관리하면서 자바 기반의 애플리케이션을 위해 이식 가능한 실행 환경을 제공한다.
간단히 말하면 어떠한 환경에서든 Java 코드의 변경 없이 실행되게 해준다.
중요하게 볼 부분은 "메모리를 관리(Garbage Collection, GC)"한다는 것과 "이식 가능한 실행 환경"을 제공한다는 것이다.
그렇기 때문에 JVM은 Java와 OS 사이에서 중개자 역할을 수행한다.
JVM을 알아야 하는 이유
한정된 메모리를 효율적으로 사용하여 좋은 퍼포먼스를 내는 프로그램을 작성하기 위해서이다.
그러기 위해서는 메모리 구조를 알아야 하기도 하지만, 메모리 관리의 역할을 하는 JVM에 대해서도 알아야 한다.
Java 프로그램 실행 과정
JVM에 대해 본격적으로 알아보기 전에, 자바 프로그램이 실행되는 과정을 보며 JVM이 어디에서 쓰이나 보자.
1. 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당 받는다.
1-1. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다
2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트코드(.class)로 변환시킨다.
3. Class Loader를 통해 .class 파일들을 JVM으로 로딩한다.
4. 로딩된 .class 파일들은 Execution Engine을 통해 해석된다.
5. 해석된 바이트코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어지게 된다.
이러한 실행 과정 속에서 JVM은 필요에 따라 Thread Synchronization이나 Garbage Collection 같은 관리 작업을 수행한다.
굉장히 복잡해 보이지만, 차근차근 알아가 보자.
JVM의 용도와 정의
위에서도 말했듯이 JVM에는 아래 2가지 기본 기능이 있다.
1. 자바 프로그램이 어느 기기, 어느 운영체제 상에서도 실행될 수 있게 하는 것 ("한 번 작성해, 어디에서나 실행한다"는 유명한 원칙)
2. 프로그램 메모리를 관리하고 최적화하는 것
JVM의 정의도 아래 2가지로 나눌 수 있다.
1. (기술적 정의) JVM은 코드를 실행하고 해당 코드에 대해 런타임 환경을 제공하는 소프트웨어 프로그램에 대한 사양(Specification)
2. (일반적 정의) JVM은 자바 프로그램을 실행하는 방법. JVM의 설정을 구성한 다음, 설정 사항에 따라 실행 중에 프로그램 리소스를 관리
개발자들이 JVM에 대해 말한다면, 대개는 어떤 기기 상에서 실행되고 있는 프로세스, 특히 자바 앱에 대한 리소스를 대표하고 통제하는 서버를 지칭한다. 이 맥락에서의 JVM은, 이런 작업들을 수행하는 프로그램 구축을 위한 요구조건들을 정의하는 JVM '사양'과는 다르다.
누가 JVM을 개발하고 유지보수하는가
누구긴.. 천재 프로그래머들이 한다.
그런 천재들이 속해있는 그룹 혹은 회사가 크게 두 가지 존재하는데, 하나는 폐쇄적인 상업코드 기반의 Oracle과 오픈소스인 OpenJDK이다.
특히 요즘의 어려운 작업 대부분은 오라클 엔지니어들이 수행한다고 한다.
JVM에서의 메모리 관리
위에서 언급했던 JVM의 주요 기능 중 하나인 메모리 관리에 대해 알아보자.
JVM을 실행하며 가장 일반적으로 확인하고 관리하는 메모리는 힙(Heap)과 스택(Stack)이다.
Garbage Collection (GC, 가비지 컬렉션)
자바가 나오기 전에는 프로그래머가 모든 프로그램 메모리를 관리했었다(Segmentation Fault).
자바에서는 JVM이 프로그램 메모리를 관리한다.
실행 중인 JVM 내부에서 Garbage Collection이라는 프로세스가 메모리를 관리하며, 이 프로세스는 자바 프로그램에서 사용되지 않는 메모리를 지속적으로 찾아내서 제거한다.
가비지 컬렉션을 위해 다양한 알고리즘과 접근 방식이 사용되었고 일관성 있는 개발과 최적화를 통해 지금의 가비지 컬렉션은 성능이 좋지만, 초창기에는 "자바는 C++만큼 메탈에 가깝지 않아 C++처럼 빠르지 않다"라는 말을 들으며 혹평을 받았다고 한다.
"메탈에 가까운"이란?
프로그래머가 어떤 프로그래밍 언어나 플랫폼이 "메탈에 가깝다"라고 말하는 것은, 개발자가 운영체제의 메모리를 프로그램적으로, 즉, 코드를 작성함으로써 관리할 수 있다는 것을 의미한다.
이론적으로는 프로그래머가 얼마나 많은 메모리를 사용하고 언제 폐기할 지를 명시함으로써 더 높은 성능을 끌어낼 수 있다고 한다.
하지만 이는 이론일 뿐, 대부분의 경우에 개발자가 하는 것보다 JVM 같은 정제된 프로세스가 더 높은 성능과 더 적은 오류를 도출한다고 한다.
다음 글에서는 JVM을 구성하고 있는 요소들에 대해 알아보도록 한다.
끝!
'Study > Java' 카테고리의 다른 글
[Java] JDK란? (0) | 2021.01.01 |
---|---|
[Java] For vs. ForEach (여러 사용법과 속도 차이) (0) | 2020.12.23 |
[Java] JRE란? (0) | 2020.12.21 |
[Java] JVM이란? - (3) 구성 요소 (2) | 2020.12.14 |
[Java] JVM이란? - (2) 표준, 구현, 인스턴스 (0) | 2020.12.14 |