Java Virtual Machine 의 줄임말이며 Java Byte Code를 OS에 맞게 해석 해주는 역할을 한다. Java compiler는 .java파일을 .class라는 Java byte code로 변환시켜준다. Byte Code는 기계어가 아니기 때문에 OS에서 바로 실행되지 않는다.. 이 때 JVM은 OS가 Byte Code를 이해할 수 있도록 해석해준다 하지만 JVM의 해석을 거치기 때문에 C언어 같은 네이티브 언어에 비해 속도가 느리지만, JIT(Just in Time)컴파일러를 구현해 이점을 극복했다. Byte Code는 JVM 위에서 OS상관없이 실행되는것이 Java의 가장 큰 장점이라고 할 수 있다. OS에 종속적이지 않고, Java 파일 하나만 만들면 어느 디바이스든 JVM 위에서 실행 할 수 있다. JVM은 크게 Class Loader, Runtime Data Areas, Excution Engine 3가지로 구성 되어 있다.
컴파일이란
소스 프로그램(개발자가 작성하는 프로그래밍 언어) 에서 기계어(컴퓨터가 해석할 수 있는 언어)로 변환하는 과정이다.
Java에서는 .java 파일을 .class 파일로 변한하는 과정을 의미한다.
컴파일 방법
public class HelloWorld{
public static void main(String args[]) {
System.out.println("Hello World");
}
}
실행하는 방법
CLI 기준으로 해당 컴파일 된 .class 가 있는 디렉토리 이동후 java <프로그램 소스> // .class 는 제외한다.
Intellij 나 eclipse 사용하면 run 실행 시 자동으로 컴파일하여 .class 파일을 생성하고 실행된다.
Just In Time. 프로그램을 실제 실행하는 시점에 번역하는 컴파일 기법이다.
javac의 컴파일과 JIT의 컴파일은 다르다. 자바컴파일러(javac)는 자바 소스코드를 바이트코드로 변환하고 JIT는 변환된 바이트코드를 해석하고 실행한다.
같은 코드를 매번 해석하지 않고 실행할 때 컴파일 하면서 코드를 캐싱 한다. 사전에 정의된 임계치에서 시작하여 호출될 때마다 감소시키는 방식으로 자주 사용되는 메서드를 찾는다. 자주 사용되는 메서드는 저장해서 해석하지 않고 바로 실행시키는 방식으로 성능을 향상시킨다.
Class Loader, Runtime Data Areas, Excution Engine로 구성되어 있다.
Class Loader
Execution Engine
프로그램 수행을 위해 OS에서 할당 받은 공간
PC 레지스터, 스택, 네이티브 메서드 스택은 스레드마다 하나씩 생성되고 힙, 메서드 영역은 모든 스레드가 공유해서 사용한다.
3-1. 힙(Heap)
프로그램 상에서 데이터를 저장하기 위해 런타임 시 동적으로 할당하여 사용하는 메모리 영역. New 연산자를 통해 생성한 객체, 인스턴스를 저장하는 공간으로, 가비지 컬렉션 대상이다.
3-2 . 메서드(Method)
클래스, 인터페이스, 필드, 메서드, Static 변수, 바이트코드 등을 보관한다.
3-3. PC 레지스터(PC Register)
현재 수행 중인 JVM 명령의 주소를 갖는다. 어떤 부분을 어떤 명령으로 실행할지를 기록하며 현재 명령과 주소를 저장한다.
3-4 .스택(Stack)
메서드 호출 시 생성되는 스레드 수행 정보를 기록한다. 임시 데이터를 저장한다.
3-5. 네이티브 메서드 스택(Native Method Stack)
자바 외의 언어로 작성된 네이티브 코드를 위한 스택이다. JNI(Java Native Interface)를 통해 호출하는 코드를 수행하기 위한 스택이다.
JDK 3-4
메서드 호출 생성되는 스레드 수행 정보를 기록.. 임시 데이터를 저장.