티스토리 뷰
JVM(=Java Virtual Machine)
- OS(=운영체제)에 구애 받지 않고 CPU가 자바를 인식, 실행할 수 있게 하는 일종의 가상 컴퓨터입니다.
- 따라서, Java는 JVM으로 인해 "운영체제에 독립적이다."는 장점이 있습니다.
컴파일 과정
원시 코드(=*.java)는 CPU가 인식하지 못하기 때문에 반드시 기계어로 컴파일 해야 합니다.
Java는 JVM을 거쳐 OS에 도달하기 때문에 곧바로 OS가 인식할 수 있는 기계어로 컴파일 되지 않고, JVM이 인식할 수 있는 Byte Code(=*.class)로 변환됩니다.
Java compiler를 통해 변환된 Byte Code는 기계어가 아니기 때문에 OS가 해석할 수 없습니다.
따라서, JVM을 통해 Byte Code를 OS가 해석할 수 있는 기계어로 변환해야 합니다.
- 원시코드 → Java compiler → Byte Code
- Byte Code→ JVM → 기계어
JVM의 구성
JVM의 구성요소는 크게 3가지로 나뉘어 집니다.
Class Loader
Byte Code(*.class)를 로드하고 링크를 통해 배치하는 작업을 수행합니다.
즉, Runtime 시에 동적으로 Byte Code(*.class) 를 로드하고, 해당 Byte Code(*.class) 를 Rumtime Data Area의 올려 놓습니다.
Class Loader는 Loading, Linking, Initialization 단계로 나뉘어져 있습니다.
Execution Engine
Class를 실행시키는 역할을 합니다.
Class Loader가 JVM의 Runtime Data Area에 Byte Code를 올려 놓으면, Excution Engine이 해당 Byte Code를 실행합니다.
Execution Engine은 Byte Code를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태(=기계어)로 변경합니다.
Excution Engine은 Interpreter, JIT compiler, Garbage Collector로 구성되어 있습니다.
- Interpreter: Byte Code를 한 줄씩 읽어 실행하는 방식입니다. 이 방식은 간단하지만 느리다는 단점이 있습니다.
- JIT Compiler: 초기에는 Interpreter 방식으로 실행하다, 특정 시점에서 Byte Code 전체를 기계어로 컴파일합니다. 이후에는 컴파일된 기계어를 직접 실행시켜 성능을 향상 시킵니다.
- Garbage Collector: 더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제합니다. 이를 통해서 자동으로 메모리 관리를 수행하여 메모리를 최적화합니다.
Runtime Data Area
JVM이 운영체제로 부터 할당받은 메모리 영역입니다.
- Method Area: 클래스에 대한 정보가 올라오는 영역. 모든 Thread가 공유합니다.
- Heap: new 키워드를 통해 생성된 인스턴스가 올라가는 영역. 모든 Thread가 공유합니다.
- Stack: 지역 변수, 매개 변수, Return 값 등 임시적으로 사용되는 값들이 저장되는 영역
- PC Register: 현재 Thread가 실행되는 부분의 주소와 명령을 저장하는 영역
- Native Method Stack: Native 언어로 작성된 코드를 실행하기 위한 영역
Native 언어란?
C나 C++과 같이 운영체제나 하드웨어와 직접적으로 상호 작용할 수 있는 프로그래밍 언어를 의미합니다.
이러한 언어들은 자바와 같은 고수준 언어보다 더 낮은 수준에서 동작하며, 성능이 중요한 시스템 프로그램이나 드라이버 개발 등에 사용됩니다.
Rutime Data Area의 Stack, PC Register, Native Method Stack은 Thread가 생성될 때 마다 새로 생성되어 쓰레드에 할당되며, Method Area, Heap은 JVM이 시작될 때 할당되어 모든 Thread가 공유하게 됩니다.
이 때, 각 Thread는 다른 Thread에 침범할 수 없기 때문에 지역 변수의 동시성 문제를 고려하지 않아도 됩니다.
'Language > JAVA' 카테고리의 다른 글
[JAVA]Thread란? (0) | 2024.09.09 |
---|---|
[JAVA]Object가 아닌 Objects 클래스 (0) | 2024.09.03 |
[JAVA]equals()와 hashCode()를 같이 재정의 하는 이유 (0) | 2024.08.30 |
[JAVA]Optional? Optional의 개념 및 사용법 (0) | 2024.08.28 |
[JAVA]JDK? JRE? JVM? (0) | 2024.08.28 |
- Total
- Today
- Yesterday