JVM
JVM이란?
- Java Virtual Machine의 줄임말
- Java가 OS에 종속되지 않고 실행되기 위한요소
- Java complier를 통해
.java
파일을 Java bytecode인 .class
로 변환시킴
- 변환된 bytecode 역시 기계어가 아니기 때문에 JVM을 통해 OS가 실행시킬 수 있도록 도움
컴파일 방법
- Java Compiler의 경우 JDK 설치시
javac.exe
라는 실행 파일 형태로 설치
javac
명령어를 활용해 .class
파일 생성
바이트코드(bytecode)란?
- VM에서 사용되는 실행 프로그램을 위한 이진 표현법
- Java bytecode는 JVM에서 사용될 수 있도록 변환된 자바 소스코드를 의미
- 이 바이트코드는 실시간 번역기 또는 JIT 컴파일러를 통해 다시 바이너리 코드로 변환되어 CPU에서 사용
JIT 컴파일러란
- JIT 컴파일(Just-In-Time compliation) 또는 동적 번역(dynamic translation)으로 불림
- 프로그램 실제 실행하는 시점에서 기계어로 번역하는 컴파일러를 지칭
- 인터프리터의 단점을 보완하기 위해 도입
- 기계어로 변환된 코드는 캐시에 보관되어 빠르게 수행이 가능하며, 컴파일보다 인터프리팅이 빠르므로 한번 실행되는 모드는 인터프리팅이 유리
- 이를 기준으로 메서드가 자주 수행되는 내용을 컴파일 수행
JVM 구성요소
JVM 구성요소
- 구성요소
- 클래스 로더(Class Loader)
- 실행 엔진(Execution Engine)
- 인터프리터(Interperter)
- JIT 컴파일러(Just-In-Time)
- 가비지 콜렉터(Garbage collector)
- 런타임 데이터 영역(Runtime Data Area)
클래스 로더(Class Loader)
- JVM 내로 클래스 파일(
.class
)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈
- 런타임시 동적으로 클래스를 로드하고
jar
파일 내 저장된 클래스들을 JVM위에 탑재
- 클래서 처음 참조 시, 해당 클래스를 로드하고 링크하는 역할
실행 엔진(Execution Engine)
- 클래스를 실행시키는 역할
- 클래스 로더가 배치시킨 바이트코드를 실제로 기계가 실행할 수 있는 형태로 변경
- 종류
- 인터프리터: 명령어 단위로 읽어서 실행하며 한 줄씩 수행하기 때문에 느린 단점
- JIT(Just-In-Time): 인터프리터 방식으로 실행하다 적절한 시점에 전체를 컴파일하여 기계어로 변경 후 인터프리팅을 더이상 하지 않음
- 가비지 콜렉터: 더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제
런타임 데이터 영역(Runtime Data Area)
Runtime Data Area
- 프로그램 수행을 위해 할당받은 메모리 공간
- 종류
- PC Register
- 스레드 시작시 생성되며, 생성될 때마다 생성되는 공간으로 스레드별 하나씩 존재
- 스레드가 어떤 부분을 어떤 명령으로 실행하는 지에 대한 기록으로 현재 수행 중인 JVM 명령의 주소를 가짐
- JVM 스택
- 프로그램 실행과정에서 임시로 할당되었다가, 메소드 빠져나가면 소멸되는 특성의 데이터가 저장되는 공간
- 변수, 임시 데이터, 스레더느 메소드의 정보 등을 저장
- Native method stack
- 바이트코드가 아닌 실제 실행 가능한 기계어로 작성된 프로그램 실행시키는 영역
- Java가 아닌 다른언어로 작성된 코드를 위한 공간
- Method Area
- 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상 저장을 위한 메모리 공간
- Runtime Constant Pool
- 스태틱 영역에 존재함
- 상수 자료형을 저장해 참조하고 중복을 제어
- 멤버 변수, 메소드, 타입 등이 저장됨
- Heap 영역
참조