간략하게 JVM을 정의하자면 자바 바이트 코드(.class)를 해석하고 실행하는 가상 머신이다.
조금 더 자세히 설명하자면,
Application의 자바 바이트 코드(.class 파일)를 클래스 로드(Class Loader)를 통해 읽어 들여서 OS에 특화된 코드로 변환(인터프리터, JIT 컴파일러)하여 실행한다.
= 운영체제의 메모리 영역에 접근하여 메모리를 관리하는 가상 머신이며 대표역할은 메모리 관리, Garbage Collector 수행
1) 스택 기반의 가상 머신이다.
: 대표적인 컴퓨터 아키텍처인 인텔 x86 아키텍처나 ARM 아키텍처와 같은 하드웨어가 레지스터 기반으로 동작하는 데 비해 JVM은 스택 기반으로 동작한다.
- 레지스터를 사용하지 않고 스택을 사용하는 이유는?? : WORA(Write Once Run Anywhere)
자바는 네트워크 다 기종의 디바이스에서 균일하게 동작함을 보장하고자 레지스터(디바이스 마다 레자스터의 수가 다르기에)를 사용하지 않고 스택을 사용
2) 심볼릭 레퍼런스
: 기본 자료형(primitive data type)을 제외한 모든 타입(클래스와 인터페이스 즉 참조타입)을 명시적인 메모리 주소 기반의 레퍼런스가 아니라 심볼릭 레퍼런스를 통해 참조한다.
3) 가비지 컬렉션(garbage collection)
: 클래스 인스턴스는 사용자 코드에 의해 명시적으로 생성되고 가비지 컬렉션에 의해 자동으로 파괴된다.
JVM의 구조는 대략 다음과 같이 3개의 영역으로 구분할 수 있으며, 내부 구조는 아래 사진과 같다.
1) Class Loader
2) Runtime Data Area
3) Execution Engine
1) Class Loader
Class Loader는 Loading -> Linking -> initialization 순으로 진행된다.
Loading
.class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 Runtime Data Area 영역에 있는 Method Area
영역에 저장하며 저장되는 데이터는 아래와 같다.
1) FQCN(Fully Qualified Class Name) : 패키지 이름 + 클래스 이름과 패키지 이름이 있다.
2) Class, Interface, Enum
3) 메소드와 변수
로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 Runtime Data Area 영역에 있는 Heap 영역에 저장.
Linking
Verify, Prepare, Reolve(optional) 세 단계로 나눠져 있다.
Verify : Loading 단계에서 읽어드린 .class 파일 형식이 유효한지 체크(.class 파일 조작 검사)
Preparation: 메모리를 준비하는 과정(클래스 변수(static 변수)와 기본값에 필요한 메모리
Resolve: 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다.
2) Runtime Data Area
The Java Virtual Machine defines various run-time data areas that are used during execution of a program. Some of these data areas are created on Java Virtual Machine start-up and are destroyed only when the Java Virtual Machine exits. Other data areas are per thread. Per-thread data areas are created when a thread is created and destroyed when the thread exits.
Runtime Data Area에는 Method Area, Heap Area, Java Stack, PC Registers,
Native Mehtod Stack으로 구성되어 있다.
Method Area
ㅇ
Heap Area
ㅇ
Java Stacks
ㅇ
PC Registers
ㅇ
Native Mehtod Stack
ㅇ
(사진)
https://www.infoworld.com/article/3272244/what-is-the-jvm-introducing-the-java-virtual-machine.html
https://dzone.com/articles/jvm-architecture-explained
(내용)
https://d2.naver.com/helloworld/1230
https://www.inflearn.com/course/the-java-code-manipulation/dashboard
https://www.youtube.com/watch?v=UzaGOXKVhwU&t=865s
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.5