728x90
반응형
JRE, JDK, JVM 소개
- JRE
- JRE는 Java Runtime Environment의 약자로 자바 런타임 환경이라는 뜻입니다.
- JRE는 Java 프로그램을 실행하기 위해 필요한 환경을 제공하며, 이는 JVM과 Java 클래스 라이브러리를 포함하고 있습니다.
- JRE만 설치되어 있다면 Java 프로그램을 실행할 수 있지만, 개발은 할 수 없습니다.
- JDK
- JDK는 Java Development Kit의 약자로 자바 개발 키트라는 뜻입니다.
- JDK는 개발자가 Java 프로그램을 개발하기 위해 필요한 도구 모음입니다.
- 이는 JRE, Javac(자바 컴파일러), jar(라이브러리), jdb(디버깅), apt(애노테이션) 등 자바로 개발할 수 있도록 여러 기능들을 제공하는 역할을 합니다.
- JVM
- JVM은 Java Virtual Machine의 약자로 자바 가상 머신이라는 뜻입니다.
- 자바 프로그램을 컴파일해서 나온 결과인 바이트 코드를 실행시켜 주는 역할을 합니다.
- JVM은 자바 프로그래밍 언어를 실행하기 위한 가상 머신으로, 자바 코드를 컴파일하여 바이트 코드(. class )를 만들면 이 코드가 자바 가상 머신 환경에서 실행합니다. 이를 통해 운영체제와 독립적인 이식성을 보장하며, 메모리 관리, 스레드 관리, 예외 처리 등의 역할을 수행합니다. JVM은 자바 실행 환경 JRE(Java Runtime Environment)에 포함되어 있습니다.
JVM
JVM을 사용하면 하나의 바이트 코드(. class)로 모든 플랫폼에서 동작하도록 할 수 있습니다.
. class 파일은 바이트 코드라고 하는데 사람이 쓰는 자바 코드에서 컴퓨터가 읽는 기계어로 중간 단계입니다.
즉, 운영체제 위에서 동작하는 프로세스로 자바 코드를 컴파일해서 바이트 코드를 해당 운영체제가 이해할 수 있는 기계어로 바꿔 실행시켜 주는 역할을 합니다.
- 바이트 코드 : 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드
왜 JVM을 알아야 하는가?
- 같은 기능을 하는 프로그램이더라도 메모리 관리에 따라 성능이 좌우될 수 있습니다.
- 메모리가 관리되지 않은 경우 속도 저하 혹은 튕김 현상 등이 일어날 수 있습니다.
- 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위함입니다.
JVM의 구조
- 1. Class Loader
- 자바 바이트 코드 파일인 Class 파일을 JVM으로 로딩하는 역할을 합니다.
- 사실 엄밀히 말하자면 JDK가 아닌 JRE의 구성요소이기는 하지만, JVM의 동작과 밀접한 연관이 있어 추가하였습니다.
- 2. Execution Engine
- 클래스 로더를 통해 JVM으로 로딩된 자바 바이트 코드를 명령어 단위로 읽어서 실행합니다.
- Execution Engine의 컴파일 방식은 여러 가지가 있는데 밑에서 더 자세하게 다루겠습니다.
- 3. Runtime Data Area
- JVM의 메모리 영역입니다.
- 자바 애플리케이션을 실행할 때 데이터를 적재하는 영역으로, Method Area, Heap Area, Stack Area, PC Register, Native Method Stack으로 나눌 수 있습니다.
- 4. Garbage Collector
- Heap 영역의 메모리를 자동으로 관리해 줍니다.
JVM의 특징
- JVM은 운영체제와는 독립적으로 동작하며, 자바 프로그램을 어느 운영체제에서든 실행할 수 있습니다.
- 우리가 작성한 Java 프로그램, Web Application Server(WAS)등을 구별하지 않고,
- Java 프로그램의 범주에 들어가는 모든 것을 실행시킵니다.
- JVM은 가비지 컬렉션을 이용하여 메모리를 자동으로 관리합니다.
- 개발자가 메모리 관리를 수동으로 할 필요가 없으며, 자바 프로그램에서 발생하는 메모리 누수 등의 문제를 방지할 수 있습니다.
- JVM은 캡슐화, 코드 검증 등의 기능을 통해 보안을 강화합니다. 따라서 자바 프로글매은 비교적 안전한 환경에서 실행될 수 있습니다.
- JVM은 다양한 라이브러리와 프레임워크를 지원하며, 개발자가 효과적으로 자바 언어를 이용해 소프트웨어를 개발할 수 있도록 돕습니다.
- JVM은 바이트 코드를 해석하면서 동시에 JIT(Just-In-Time) 컴파일러를 이용하여 바이트 코드를 네이티브 코드로 변환시켜서 성능을 향상시킵니다.
- JVM은 멀티 스레딩을 지원하여, 동시에 여러 작업을 처리할 수 있습니다.
- JVM은 디버깅에 유용한 기능을 제공합니다. 예를 들어, 스택 추적과 메모리 덤프를 이용하여 디버깅을 수행할 수 있습니다.
- 스택 기반의 가상 머신입니다.
JVM의 동작원리
- 클래스 로딩
- JVM은 먼저 클래스 로더를 이용하여 필요한 클래스 파일을 로딩합니다.
- 클래스 로더는 클래스 파일을 읽어 들이고, JVM 내부의 메모리에 클래스 정보를 저장합니다.
- 바이트 코드 해석
- JVM은 클래스 파일 내의 바이트 코드를 해석하면서, JVM 내부에서 실행할 수 있는 형태로 변환합니다.
- 실행 엔진
- 변환된 코드는 실행 엔진에 의해 실행됩니다. 실행 엔진은 인터프리터, JIT 컴파일러, GC 등으로 구성됩니다.
- 인터프리터
- 바이트 코드를 한 줄씩 해석하면서 실행합니다.
- 빠른 시작 속도와 적은 메모리 사용량을 가지지만, 실행 속도가 느립니다.
- JIT 컴파일러
- 인터프리터보다 실행 속도가 빠릅니다. JVM은 JIT 컴파일러를 이용하여 바이트 코드를 네이티브 코드로 컴파일하고 캐시에 저장합니다.
- 이후 같은 코드가 반복적으로 실행될 때는 캐시에 저장된 네이티브 코드를 사용하여 실행하므로, 실행 속도가 빨라집니다.
- GC
- VM은 GC를 이용하여 메모리 관리를 수행합니다. GC는 더 이상 사용되지 않는 객체를 찾아 제거하며 메모리를 확보합니다.
- 결과 출력
- 실행 엔진이 실행한 코드의 결과는 콘솔이나 파일 등에 출력될 수 있습니다.
이러한 과정을 통해 JVM은 바이트 코드를 실행하며, 자바 프로그램이 운영체제와 독립적으로 실행될 수 있도록 합니다.
Ref.
728x90
반응형
'🖥 백엔드 개발 > JVM' 카테고리의 다른 글
컴파일 언어, 인터프리터 언어 (0) | 2023.09.14 |
---|---|
HotSpot JVM란? (0) | 2023.03.31 |