JVM
- 자바 가상머신으로 자바 바이트 코드를 실행할 수 있는 주체!
- 컴파일러를 통해 바이트 코드로 변환된 파일을 JVM에 로딩하여 실행
JVM의 구조
- Class Loader : JVM 내(Runtime Data Area)로 Class 파일을 로드하고 링크
- Execution Engine : 메모리(Runtime Data Area)에 적재된 클래스들을 기계어로 변경해 실행
- Garbage Collector : 힙 메모리에서 참조되지 않는 개체들 제거
- Runtime Data Area : 자바 프로그램을 실행할 때, 데이터를 저장
JVM 실행 과정
- JVM은 OS로부터 메모리(Runtime Data Area)를 할당 받음
- 컴파일러(javac)가 소스코드(.java)를 읽어 바이트 코드(.class)로 변환
- Class Loader를 통해 Class파일을 JVM내 Runtime Data Area로 로딩
- 로딩된 Class 파일을 Execution Engine을 통해 해석 및 실행
JVM 메모리(Runtime Data Area) 구조
- 메서드(static) 영역
- 클래스가 사용되면 해당 클래스의 파일(.class)을 읽어들여, 클래스에 대한 정보(바이트 코드)를 메서드 영역에 저장
- 클래스와 인터페이스, 메서드, 필드, static 변수, final 변수 등이 저장되는 영역입니다.
- JVM 스택 영역
- 스레드마다 존재하여 스레드가 시작할 때마다 할당
- 지역변수, 매개변수, 연산 중 발생하는 임시 데이터 저장
- 메서드 호출 시마다 개별적 스택 생성
- JVM 힙 영역
- 런타임 시 동적으로 할당하여 사용하는 영역
- new 연산자로 생성된 객체와 배열 저장
- 참조가 없는 객체는 GC(가비지 컬렉터)의 대상
- PC register
- 쓰레드가 현재 실행할 스택 프레임의 주소를 저장
- Native Method Stack
- C/C++ 등의 Low level 코드를 실행하는 스택