Java Virtual Machine(JVM)은 자바를 실행하기 위한 가상 머신이다.
Java 파일 하나만 만들면 어느 OS든 각자의 OS에 맞는 JVM 위에서 실행 할 수 있게 되는 것이다.
.java
파일을 .class
라는 Java byte code로 변환 시켜 준다.cd 파일경로
javac 파일명.java
.class
확장자의 파일명을 입력한다 : java 파일명
java 패키지1.패키지2.패키지3.파일명
으로 실행해야 한다.자바로 작성된 프로그램은 다음과 같은 순서로 실행된다.
.class
파일을 메모리상의 JVM으로 가져온다.Execution Engine에서 클래스파일(바이트코드로 구성)을 기계어로 변경해서 명령어 단위로 실행한다.
바이트코드는 특정 하드웨어가 아닌 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법이다.
.class
이다.자바 바이트 코드는 각 OS에 맞는 자바 가상 머신(JVM)만 설치되어 있으면, 어떤 운영체제에서라도 실행될 수 있다.
JIT 컴파일러는 자바 컴파일러가 생성한 자바 바이트 코드를 런타임에 바로 기계어로 변환하는 컴파일러이다.
즉, 바이트코드를 컴퓨터 프로세서(CPU)로 직접 보낼 수 있는 명령어로 바꾸는 프로그램이다.
동적 번역(dynamic translation)이라고도 불리는 이 기법은 프로그램의 실행 속도를 향상시키기 위해 개발되었다.
반면 Java애플리케이션은 OS 사이에 JVM이라는 가상머신을 한 번 더 거치기 때문에 속도가 느리다는 단점이 있었다.
Interpreter 방식은 하드웨어에 맞게 완전히 컴파일된 상태가 아니고 실행 시에 명령어를 하나씩 해석해서 처리하기 때문에 속도가 느렸다.
.class
파일(바이트코드)를 네이티브 기계어로 한 번에 컴파일 후 사용한다.= 평소에는 Interpreter 방식으로 실행 = 적절한 시점에 바이트 코드 전체를 컴파일 하여 네이티브 코드로 변경= 더 이상 Interpreting 하지 않고 네이티브 코드로 직접 실행
.class
파일들을 엮어서 JVM이 운영체제로부터 할당받은 메모리영역인 Runtime Data Area로 적재하는 역할을 Class Loader가 한다.클래스 로딩은 클래스를 로딩하는 시점 또는 실행 중간에도 할 수 있다.
클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보같은 필드 정보
메소드의 이름, 리턴 타입, 파라미터, 접근 제어자 정보같은 메소드 정보
Type정보(Interface인지 class인지)
Constant Pool(상수 풀 : 문자 상수, 타입, 필드, 객체 참조가 저장됨)
static 변수, final class 변수
Heap area (힙 영역)
new 키워드로 생성된 객체와 배열이 생성되는 영역이다.
메소드 영역에 로드된 클래스만 생성이 가능하다.
Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역이다.
Stack area (스택 영역)
지역 변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값등이 생성되는 영역이다.
int a = 10;
이라는 소스를 작성했다면? Person p = new Person();
이라는 소스를 작성했다면? PC Register (PC 레지스터)
Program Counter 즉, 현재 쓰레드가 실행되는 부분의 Java Virtual Machine Instruction의 주소와 명령을 저장하고 있는 영역이다. (*CPU의 레지스터와 다름)
Native method stack
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.
보통 C/C++등의 코드를 수행하기 위한 스택이다. (JNI)