JVM : Java Virtual Machine
- 자바 프로그램이 실행되는 가상 머신이다.
- 자바 어플리케이션이 어느 CPU나 OS에서도 실행될 수 있게 지원
기존 컴파일언어(C, C++ ...) vs JVM
- 기존의 컴파일 언어
- 프로그래밍 언어가 컴파일되는 시점에서, 해당 운영체제에 맞는 binary code로 변환된다.
- JVM
- 자바가 컴파일되는 시점에서는 java code -> java bytecode로 변환됨
- java bytecode는 실행 시점에 JVM에 의해 실행된다.
JVM vs JRE vs JDK
- JVM (Java Virtual Machine)
- JRE (Java Runtime Environment) : JVM + 표준 라이브러리
- JDK (Java Dev Kit) : JRE + 컴파일러 등 개발환경에 필요한 요소들
자바 어플리케이션의 실행 과정
- 어플리케이션 실행 -> JVM이 OS로부터 메모리를 할당받는다.
- 자바 컴파일러가 자바 소스코드(.java)를 바이트코드(.class)로 변환
- Class Loader에서 바이트코드를 JVM으로 로딩한다.
- Execution Engine에서 바이트코드가 해석된다.
- 해석된 코드를 Runtime Data Area가 실행한다.
.class 파일 구조
JVM 구성
Class Loader
- Loading
- .class 코드 로딩
- 한번에 모든 클래스를 올리지 않고, 필요할 때 동적으로 올림
- Linking
- Initialization
Runtime Data Area
- Method Area (모든 스레드 공유)
- 클래스와 관련된 모든 정보가 저장된다.
- Runetime Constant Pool : 상수 자료형을 저장하여 참조하는 역할
- Heap (모든 스레드 공유)
- 런타임에 생성되는 모든 객체가 저장된다
- 객체의 생성 및 소멸 처리
- Young Generation : 생명주기가 짧은 객체 / Old Gen : 생명주기가 긴 객체
- GC에 의해 지속적으로 메모리가 관리됨
- JVM Stack (스레드별로 생성)
- 메서드 호출과 관련된 정보를 저장한다.
- 메서드가 호출될 때마다 Stack Frame 생성
- 해당 메서드의 매개변수, 지역 변수, 메서드 호출 및 복귀 주소 등 저장
- 프레임 구조
- 지역변수 : Array의 형태로 저장되어 접근 가능
- Operand Stack : 연산의 중간 결과물을 저장하는 stack

- PC Registers (스레드별로 생성)
- 현재 작업중인 program count의 위치를 기록 -> 멀티스레딩 환경에서 자신의 작업으로 돌아오기 위함
- Native Method Stacks (스레드별로 생성)
- c/c++로 작성된 프로그램을 실행하기 위한 스택
Execution Engine

1. Interpreter
- 바이트코드 해석하여 실행
2. JIT Compilor (just in time)
- 반복되는 코드를 발견하여 전체 바이트코드를 컴파일하고
- Native Code(c/c++)로 변경하여 사용
3. Garbage Collector
- 더이상 참조되지 않는 메모리 객체를 모아 제거
- performance tunning에서 가장 중요한 요소!
더 많은 내용이 궁금하다면?
소마 14기 CS스터디그룹 github
출처