JVM ( Java Virtual Machine )
OS 위에서 Java 실행시켜줌 → OS에 종속받지 않음
프로그램 실행 중 런타임 데이터 영역 사용
컴파일러에 의해 자바 바이트 코드로 변경된 소스코드를 JIT 컴파일러가 바이너리 코드로 변환
JVM 구조
class loader
- class file을 읽으며 JVM 수행 (런타임 시 동적 로드)
- 클래스 처음 참조할 때, 로드/링크함
Execution Engine
바이트 코드를 기계어로 변경
- Runtime Data Area에 있는 클래스 실행시킴
- 인터프리터 (Interpreter)
바이트 코드를 명령어 단위로 읽어 실행 (느림) - JIT 컴파일러 (Just in Time)
인터프리터 방식으로 실행하다 적절 시점에 반복되는 바이트 코드를 전체 컴파일해 기계어로 변경 (캐싱) - 가비지 콜렉터 (Garbage Collector)
사용되지 않는 인스턴스 Heap 메모리에서 삭제
자동 실행되고 GC가 실행되는 시간은 정해지지 않음
Full GC 발생 시 치명적인 오류 날 수 있음
Runtime Data Area
JVM의 메모리 영역
- Method (= class area, static area)
- 클래스 정보 처음 메모리에 올릴 때, 초기화되는 대상 저장 (멤버 변수, 메서드, 타입)
- 프로그램 종료될 때까지 저장 (명시적 null이면 GC)
- 모든 thread 공유
- Heap
- 객체 저장 (thread에 의해 공유됨, 객체 생성되고 garbage collector에 의해 정리됨, 상수 풀)
- 객체가 더 이상 사용하지 않거나 명시적 null인 경우 GC 대상이 됨
- 모든 thread가 공유
- heap의 참조 주소는 스택이 가짐
- Stack
- 메서드 실행 공간 (thread 별 별도 관리, 메서드 호출 시마다 메서드 프레임 적층, 로컬변수도 쌓임)
- 임시 저장, 메서드 수행 끝나면 프레임 별 삭제
- PC Register
- 현재 실행 중인 JVM 주소 저장
- Native Method Stacks
- 기계어로 작성된 프로그램 실행 시키는 공간 (다른 언어로 작성된)
- Runtime Constant Pool
- 상수 자료형 저장
JVM 동작 과정
- java 소스 파일이 컴파일러에 의해 바이트 타입의 클래스 코드로 변경됨
- 클래스 로더가 클래스 파일 읽으며 JVM 수행됨 (런타임 시에 동적으로 JVM 수행됨)
- 클래스 로더에 의해 Runtime Data Area 내에 배치된 바이트 코드들을 명령어 단위로 읽으며 실행
참고 블로그