JVM이란?
Java Virtual Machine의 줄임말로
자바를 실행하기 위한 가상 기계(컴퓨터)다.
한 번 작성하면, 어디서든 돌아간다.(Write once, run anywhere)
자바는 ' 한 번 작성하면, 어디서든 돌아간다.(Write once, run anywhere)'는 슬로건이 있다.
Java는 OS에 종속적이지 않다는 특징을 가지고 있는데 OS위에서 Java를 실행시킬 무언가가 필요하다. 그것이 JVM이다.
즉, 자바로 작성된 코드를 운영체제와 무관하게 실행할 수 있게 도와주는 핵심적인 역할을 한다.
자바가 아닌 C언어로 개발한 프로그램이 있고, 이 프로그램을 컴파일하면 Test.exe가 만들어진다. Test.exe는 윈도우에서 실행되는 '실행 파일'이라고 한다. 이 실행 파일은 윈도우 운영체제에 맞게 만들어졌기 때문에 리눅스 운영체제에서는 실행할 수 없게 된다.
만약 이 Test.exe파일을 리눅스 운영체제에서 실행하려면, 리눅스 환경에서 다시 컴파일하고, 리눅스 운영체제에 맞는 실행파일을 새로 만들어야 하는 과정을 거쳐야 한다.
하지만 자바에서 Example라는 이름의 프로그램을 만들고 컴파일하면 Example, class라는 파일이 생성하게 된다.
이 파일을 바이트 코드라고 하는데 완벽한 실행파일이 아니라 운영체제에 맞는 완벽한 기계어가 아닌 중간 기계어고,
이 바이트 코드를 실행하려면 JVM(자바 가상 머신)이 필요하다.
바이트 코드에 대해서 자세하게 알아보기
바이트 코드(Bytecode)는 고급 언어로 작성된 소스 코드를 가상머신이 이해할 수 있는 중간 코드로 컴파일한 것을 말한다. 쉽게 말하자면 가상머신을 위한 기계어로, 가상머신이 있는 곳이라면 거의 존재한다고 보면 된다.
원시 코드에서 바이트 코드로는 컴파일이 진행되고, 가상 머신은 이 바이트 코드를 실제 머신에 맞게 구현된 인터프리터로 해석해 대응되는 실제 머신 기계어 코드를 실행한다.
바이트 코드는 생성까지는 컴파일이고, 바이트 코드 자체는 인터프리터 언어다.
덕분에 인터프리터 언어의 단점인 느린 실행 속도를 극복하면서 가상머린이라는 단일 종류의 구현을 통해 호환성이 보장된다.
(인터프리터가 느린 이유는 텍스트를 직접 읽어 실행하기 때문이다.)
바이트 코드는 자바에서만 쓰이는 것이 아닌 Python 등 일부 인터프리터 언어에서는 구현체에서 바이트 코드를 생성하기도 한다.(Python을 사용하다 보면 *.py파일 말고도 *.pyc로 된 파일을 볼 수 있는데 이 *.pyc파일이 Python 바이트 코드다.
이때 운영체제에서 직접 실행하는 것이 아닌 가상 머신에서 먼저 실행하고, 이 가상 머신이 운영체제에 맞는 완벽한 실행 파일로 바꿔준다.
Class Loader
- .class 파일을 JVM으로 로드해 준다.
- 런 타임시 동적으로 클래스를 로드하고 jar 파일 내 저장된 클래스들을 JVM위에 탑재한다.
Execution Engine
- 인터프리터: 바이트코드를 한 줄씩 읽어서 실행
- JIT 컴파일러: 자주 사용하는 코드를 기계어로 바꿔 성능 향상
Garbage Collector : 더 이상 쓰이지 않는 객체는 메모리에서 자동으로 제거한다.
가비지 컬렉터란?
이름 그대로 쓰레기를 수집하는 기능
여기에서 쓰레기란? 더 이상 사용하지 않는 메모리를 의미한다.
C나 C++에서는 필요 없는 메모리 사용 해제를 프로그래머가 직접 해야 했지만, 자바는 가비지 컬렉터가 사용하지 않는 동적 메모리를 주기적으로 수거한다.
Runtime Data Area:
- Heap: 객체 저장
- Stack: 메서드 실행 정보 저장
- Method Area: 클래스 정보 저장
- PC Register: 현재 실행 중인 명령어 위치 저장
JVM, JDK, JRE, JIT는 무슨 관련이 있을까?
JVM에 대해서 조사하다 보니 JDK, JRE, JIT JIT라는 키워드가 자주 보이게 된다.
JVM에 대해서 알아보는 김에 JDK, JRE, JIT도 알아보자.
1. JDK : 자바 애플리케이션을 개발하고 실행할 수 있는 전체 도구 세트
JDK의 주요 특징
- 자바 개발자라면 무조건 JDK를 설치가 필요하다.
- 자바 버전마다 JDK 버전도 있다.
JDK의 구성 요소
1. JRE(Java Runtime Environment)
2. 컴파일러(javac) : 자바 소스(.java)를 바이트 코드(.class)로 변환
3. jdb
4. 문서 생성기(javadoc)
5. 패키징 도구(jar)
6. 기타 개발 도구들
2. JRE : 자바 프로그램을 실행할 수 있게 해주는 환경
JRE의 주요 특징
- 개발은 불가능하고 실행만 가능하다.
- 예전에는 사용자가 자바앱을 실행하려면 JRE만 따로 설치했어야 했다.
JRE의 구성 요소
1. JDK
2. 클래스 라이브러리
3. 필수 실행 파일(java, javaw 등)
3. JIT : JVM 내부의 컴포넌트, 바이트 코드를 네이티브 머신 코드로 실시간으로 변환해서 성능을 높인다.
JIT의 주요 특징
- 성능 최적화의 핵심
- JIT은 JVM에 자동으로 포함되어 있어서 따로 설정할 필요가 없다.
작동 방식
1. JVM이 처음에는 바이트 코드를 인터프리터 방식으로 실행한다.
2. 특정 메서드가 자주 호출되면 JIT가 감지하고 머신 코드로 변환한다.
3. 이후부터는 인터프리터 없이 머신 코드를 직접 실행하여 속도를 향상시킨다.
'오늘의 주제' 카테고리의 다른 글
SQL 명령문의 실행 순서 과정 (1) | 2025.04.28 |
---|---|
인터페이스를 사용하는 이유는 무엇일까? (2) | 2025.04.21 |
GC(가비지 컬렉션)이란 무엇일까? (1) | 2025.04.20 |
자바의 메서드 오버로딩과 오버라이딩에 대한 것 (1) | 2025.04.17 |
자바의 주요 특징은 무엇인가? (1) | 2025.04.17 |