JVM이란?
JVM은 Java Virtual Machine 의 약자로 자바 가상 머신입니다.
Java로 작성된 애플리케이션은 JVM에서만 실행됩니다.
JVM은 Java 바이트코드를 읽고 이를 OS에 맞게 해석하여 실행할 수 있도록 하는 역할을 수행합니다.
이렇게 JVM이 OS과 Java 애프릴케이션 사이에서 역할을 수행하기 때문에
- Java 애플리케이션은 OS에 독립적으로 실행될 수 있습니다.
- Java 코드의 변경없이, 다양한 OS에서 실행할 수 있습니다.
또한 Garbage Collection을 이용해서, 메모리를 효율적으로 관리해 줍니다.
JVM의 역할
- Java 바이트 코드를 OS에 맞게 해석하여 실행
- Garbage Collection을 이용해 메모리를 효율적으로 관리
Java 바이트 코드
- Java 바이트 코드는 JVM이 이해할 수 있는 언어로 변환된 Java 소스 코드 입니다.
- Java 컴파일러에 의해서 변환되며 .class 확장자를 가집니다.
- 코드의 명령어 크기가 1 Byte라서 바이트 코드라고 불립니다.
JVM의 구성요소
JVM은 크게 Class Loader / Runtime Date Area / Execution Engine 로 구성됩니다
- Class Loader :
Java 컴파일러가 생성한 .class 파일들을 JVM으로 읽어오고, 이를 메모리에 적재하는 역할을 합니다.
- Runtime Data Area :
프로그램의 실행을 위해, OS로부터 할당받은 메모리 공간입니다.
Method Area / Heap Area / Stack Area / PC Register / Native Method Stack으로 구성되어 있습니다.
- Method Area : static area로 class 정보를 처음 메모리에 적재할 때, 초기화되는 대상을 저장하는 공간
- Heap Area : new 연산자로 생성된 객체와 배열이 저장되는 공간
- Stack Area : 소멸될 정보(변수, 임시 데이터, 메소드 매개변수, 리턴값)를 임시로 저장하는 공간
- PC Register : 스레드가 생성될 때마다 생성되어, 현재 수행중인 JVM 명령의 주소값을 갖는 공간
- Native Method Stack : Java 코드가 아닌, Native 언어(C언어)를 실행시키는 공간
- Execution Engine :
Runtime Data Area 에 적재된 바이트 코드를 실행하는 역할을 합니다.
Interpreter / JIT Compiler / Garbage Collector 로 구성되어 있습니다.
- Interpreter : 바이트 코드를 Native 코드로 변환하는 역할. 한줄씩 컴파일하여 변환
- JIT(Just In Time) Compiler : Interpreter의 효율을 높이기 위한 역할. 반복되는 코드를 발견하면 캐싱하여 변환
- Garbage Collector : Runtime Data Area의 Heap Area 에 있는 더 이상 참조되지 않은 객체를 정리
Java 코드의 실행 과정
- Java 컴파일러가 Java 코드(.java)를 Java 바이트 코드(.class)로 컴파일
- 변환된 Java 바이트 코드(.class)를 JVM의 Class Loader에게 전달
- Class Loader는 Java 바이트 코드(.class)를 JVM 메모리에 로드
- Execution Engine은 JVM 메모리에 적재된 바이트 코드를 명령어 단위로 가져와서 실행
- JVM은 필요에 따라서 쓰레드 동기화 / GC 등 관리 작업을 수행
JVM의 특징
- 스택 기반의 가상 머신
- 심볼릭 레퍼런스 : 기본형 타입을 제외한 모든 타입을 심볼릭 레퍼런스를 통해 참조
- Garbage Collection : 객체들은 사용자 코드에 의해 생성되고 Garbage Collection에 의해 파괴
- 기본 자료형을 명확하게 정의하여 플랫폼 독립성 보장
- Network Byte Order
'Programming Language > JAVA' 카테고리의 다른 글
문자열을 숫자로 (Integer) parseInt(String) VS valueOf(String) (0) | 2022.01.17 |
---|---|
왜 Java 11을 사용하나요? (0) | 2021.05.17 |