1. JVM이란 무엇인가
- Java Virtual machine 자바 가상 기계
- 자바 프로그램은 완전한 기계어가 아닌 바이트 코드이기 때문에 이것을 해석 할 수 있는 가상의 운영체제가 필요
- 운영 체제와 자바 프로그램을 중계하여 동일한 실행 결과가 나오도록 설계한 것
- 기계어 : CPU가 읽고 실행할 수 있는 이진 코드
- 어셈블리어 : 기계어보다는 한 단계 높은, 기계어를 사람이 알아보기 쉽게 가공한 언어
- 고급어 : 개발자가 다루는 언어들. JAVA 등
- 바이트코드 : 고급 언어를 변환하여 가상 머신이 이해할 수 있게 한 코드. 가상 머신은 바이트 코드를 기계어로 컴파일한다.

2. 컴파일 하는 방법
3. 실행하는 방법
- 컴파일 : 프로그래밍 언어를 컴퓨터가 실행 가능한 기계어로 만드는 일

- 컴파일러 : 파일 전체를 읽은 뒤, 코드의 의미를 해석하고 파일 전체를 어셈블리어로 변환 후 기계어로 변환한다.
- 인터프리터 : 코드를 한 줄 한 줄 읽어내려가며 한 줄씩 기계어가 아닌 중간 단계의 바이트 코드로 변환한다. 바이트 코드를 한줄씩 해석.
4. 바이트 코드란?
- JVM이 이해할 수 있는 언어로 변환된 자바 소스 코드
- 자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1byte라서 자바 바이트 코드라고 불림
- JVM만 설치되어 있다면 어떤 운영체제에서라도 동작 가능
5. JIT 컴파일러란? 동작 방법?
- Just In Time
- JIT 컴파일러는 런타임 시 JAVA 어플리케이션의 성능을 향상시키는 Java Runtime Environment의 구성요소
- 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 네이티브 코드를 실행하기 때문에 전체적인 실행 속도는 인터프리팅 방식보다 빠름
- 프로그램을 실행하는 시점에 기계어로 번역하는 컴파일 기법
6. JVM 구성 요소
1) Class Loader
- 실행 시 필요한 클래스를 동적으로 메모리에 로드하는 역할을 한다.
찾았을 경우 해당 클래스 파일을 읽엉서 class 객체로 변환.
못찾았을 경우 ClassNotFoundException발생.
2) Execution Engine
- 메모리에 로드된 클래스를 실행시키는 역할
- 인터프리터, JIT 컴파일러로 자바 바이트 코드를 기계가 실행할 수 있는 형태로 변경
3) Runtime Data Area
-
프로그램이 실행되면 JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 용도에 따라 여러 영역으로 나누어 관리
-
1) Method area
프로그램 실행 중 어떤 클래스가 사용되면 JVM은 해당 클래스의 클래스 파일을 읽고 분석하여 클래스 데이터를 이곳에 저장한다. 이 때 클래스 변수도 이 영역에 함께 생성된다.
-
2) Heap
인스턴스가 생성되는 공간. 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 즉 인스턴스변수들이 생성되는 공간
-
3) Call stack or Execution stack(호출스택)
메서드 작업에 필요한 메모리 공간을 제공한다.
-
4) Garbage Collector
더 이상 참조하지 않는 힙 영역의 메모리를 정리
7. JDK와 JRE 차이
-
JRE : Java Runtime Environment 자바 실행환경
프로그램 실행에 필요한 자바 가상기계, 라이브러리인 API만 포함
JVM + 표준 클래스 라이브러리
-
JDK : Java Development Kit 자바 개발키트
개발에 필요한 자바 가상기계, 라이브러리 API, 컴파일러 등의 개발도구가 포함
JRE + 개발에 필요한

출처 : https://sosocodingday.tistory.com/2