전에 포스팅한 자바 컴파일 과정을 참고하자 !
jvm
- 자바 가상머신
- 컴파일러가 컴파일한 바이트 코드를 실행할 수 있는 주체
- Class Loader, Garbage Collector, Runtime Data Area, Excute engine 로 구성되어 있다. → CPU나 운영체제(플랫폼)과 독릭접으로 동작 가능하다.
Class Loader
JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행한다.
런타임 시에 동적으로 클래스를 로드합니다.
- 클래스 로더 세부 동작
1. 로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드합니다.
2. 검증 : 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사합니다.
3. 준비 : 클래스가 필요로 하는 메모리를 할당합니다. (필드, 메서드, 인터페이스 등등)
4. 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경합니다.
5. 초기화 : 클래스 변수들을 적절한 값으로 초기화합니다. (static 필드)
Garbage Collector
힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 한다.
이때, GC가 역할을 하는 시간은 언제인지 정확히 알 수 없다.
Runtime Data Area
클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명렁어 단위로 읽어서 실행한다.
인터프리터 방식과 JIT 방식이 있다.
- 인터프리터 : 자바컴파일러에 의해 변환된
.class
파일 내의 바이트 코드를 특정 환경의 기계에서 실행될 수 있도록 명령어를 하나씩 읽어서변환한다. 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느리다는 단점을 가집니다.
- JIT 컴파일러(Just-In-Time Compiler) : 인터프리터의 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에는 해당 메서드를 더이상 인터프리팅 하지 않고, 바이너리 코드로 직접 실행하는 방식입니다. 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적인 실행속도는 인터프리팅 방식보다 빠릅니다.
Excute engine
JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다.
참고 https://steady-coding.tistory.com/305