컴파일
자바 바이트 코드
프로그램을 실제 실행하는 시점
에 기계어로 번역하는 컴파일러
인터프리터 방식을 사용하다가 적절한 시점에 컴파일
인터프리터 방식의 단점을 보완
네이티브 코드는 캐시에 보관 → 속도가 빠르다.
적절한 시점에 바이트 코드 전체를 컴파일
하여 기계어로 변경
컴파일은 인터프리터보다 오래 걸리기 때문에 한 번만 실행되는 코드라면 인터프리팅하는 것이 유리
- 따라서 JIT컴파일러를 사용하는 JVM은 내부적으로 해당 메서드가 얼마나 자주 수행되는지 체크 후 일정 정도를 넘을 때만 컴파일을 수행
- JVM은 인터프리터 모드로 실행하는 동안 애플리케이션을 모니터링하면서 가장 자주 실행되는 코드 파트를 발견하여 JIT 컴파일을 수행(비용이 비싸기 때문)
⇒ Hotspot JVM에서 실행
프로파일링을 통해 핫스팟을 찾아낸 뒤 해당 부분에 대한 네이티브 코드를 생성
JVM 구성요소
컴파일을 마친 클래스 파일을 읽어들임
프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간
PC Register
JVM 스택 영역
메소드를 실행하기 위한 정보들이 저장되는 공간
프로그램 실행 과정에서 임시로 할당되었다가 메소드 밖에서 바로 소멸되는 특성의 데이터
를 저장
메소드 호출 시마다 각각의 스택 프레임(Frame그 메서드만을 위한 공간)이 생성.
메소드 안에서 사용되는 값들을 저장
매개 변수, 지역변수, 리턴 값 및 연산 시 일어나는 값
들을 임시로 저장기본형 타입변수 값들은 저장, 객체들은 참조값만 저장(heap 영역에 존재하는 객체들의 참조)
스레드 별로 할당됨
지역변수 배열
operand Stack
Native Method Stack
static area(= Method Area, Class Area) → permanent Area
Runtime Constant Pool
Heap 영역
new 연산자로 생성
되는 객체와 배열을 저장최초로 생성
되는 공간
Method Area + Heap은 모든 쓰레드가 공유 → 멀티쓰레드 환경에서 동기화에 주의해야 함