Java는 JVM이라는 가상 머신을 통해 OS 종류와는 관계 없이 구동 환경만 적합하면 코드를 실행할 수 있다. 따라서 Java의 특징적인 컴파일 환경, JVM의 구조 등을 정리하려 한다.
C언어를 예시로 한번 살펴 보려고한다.
C는 컴파일 시 바로 Binary code인 기계어로 변환이된다.
이때 특정 OS, CPU 구조를 사용하는 컴파일러에 의해서 컴파일 됐으며,
다른 OS, CPU 구조를 사용하는 환경에서는 이 기계어를 읽을 수 없게 된다.
자바 컴파일 과정은 소스 파일을 JVM이 읽을 수 있는 바이트 코드로 변경하는 과정이다.
자바 런타임 과정은 JVM에서 컴파일된 바이트 코드가 실제로 실행되는 단계이다. 아래는 JVM의 구조다.
로드: 클래스 파일을 가져와서 JVM의 메모리에 로드한다.
Linking을 통해 로드된 .class 파일들을 검증, 준비, 해석과정을 거친다.
이 때 실행 엔진은 두 가지 방식을 함께 사용해 실행한다. 인터프리터 컴파일 방식은 코드를 한줄씩 읽어 해석하기 때문에 속도가 느리다. JIT는 느린 인터프리터 방식을 보완해준다.
인터프리트: 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행한다.
JIT 컴파일러: 프로그램 실행 중 자주 사용되는 바이트코드 부분을 실시간으로 기계어로 컴파일하여 실행 속도를 향상시킴
Byte code: "가상 머신이 읽을 수 있는 이진 코드"
Binary code: "기계가 읽을 수 있는 이진 코드"
JVM이 운영체제로부터 할당받은 메모리영역이다.
Method Area : 클래스에 대한 정보가 올라오는 영역. 모든 쓰레드가 공유
Heap : new 키워드를 통해 생성된 인스턴스가 생성되는 영역. 모든 쓰레드가 공유
Stack : 지역변수, 매개변수, 리턴값 등 임시적으로 사용되는 값들이 저장되는 영역
PC Register : 현재 쓰레드가 실행되는 부분의 주소와 명령을 저장하는 영역
Native Method Stack : Native 언어로 작성된 코드를 실행하기 위한 영역
JVM에 대해 공부하는데 큰 도움 되었습니다. 감사합니다.