[Java] ☕ 자바 가상머신 (JVM)
📖 자바 실행 과정
컴퓨터에서 .java
코드 작성하고, 자바 컴파일러인 javac
를 통해 컴파일 명령을 내리면 .class
파일이 생성된다.
이후, 이 .class
바이트 코드는 클래스 로드를 통해 JVM Runtime Data Area
로 로딩되고, 로딩된 .class
바이트 코드를 JVM에 가져다주면 컴퓨터가 프로그램을 실행할 때, 이 JVM이 그때그때 기계어로 해석한다.
🍄 바이트 코드란?
- 가상 컴퓨터에서 돌아가는 실행 프로그램을 위한 이진 표현법이다.
- 자바 바이트코드는
JVM
이 이해할 수 있는 언어로 변환된 자바 소스코드로 1바이트로 이루어져 있다. .class
파일을 의미한다.
바이트 코드는 Interpreter 또는 JIT 컴파일러에 의해 바이너리 코드로 변환된다.
💡 바이너리 코드란?
- 바이너리 코드 또는 이진 코드라고 함
- 컴퓨터가 인식할 수 있는 0과 1로 구성된 이진코드
💡 기계어란?
- 0과 1로 이루어진 바이너리 코드이다.
- 기계어가 이진코드로 이루어졌을 뿐 모든 이진코드가 기계어인 것은 아니다.
- 기계어는 특정한 언어가 아니라 CPU가 이해하는 명령어 집합이며, CPU 제조사마다 기계어가 다를 수 있다.
📖 Java Virtual Machine(JVM)
자바 가상 머신 JVM(Java Virtual Machine)은 자바 프로그램 실행환경을 만들어 주는 소프트웨어으로, 실행 이외에도 프로그램 메모리를 관리하고 최적화하는 기능을 가지고 있다.
Java는 어떠한 JVM
에서도 실행이 가능하기 때문에 독립적인데 비해서, JVM
은 플랫폼에 의존적이다.
Java는 플랫폼에 종속적이지 않지만 JVM은 플랫폼에 종속적이다.
즉, OS에 종속받지 않고 CPU 가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터이다.
또한, 프로그램 메모리를 관리하고 최적화 하는 기능을 가지고 있다.
📖 JVM의 구성요소
JVM
은 크게 다음 3가지로 구성된다.
- Class Loader
- Execution Engine
- Runtime Data Area
🍄 Class Loader
자바는 동적으로 클래스를 읽어오므로 모든 코드가 런타임에서 자바 가상 머신과 연결되어 있다.
이때, 클래스 로더는 .class
을 JVM의 메모리 영역인 Runtime Data Access에 배치한다
- loading : 클래스 파일을 메모리에 로드
- Linking : 검증 과정
- Verifying : JVM 명세 확인 (가장 복잡하고, 시간이 가장 많이 걸린다)
- Preparing : 클래스와 변수에 메모리 할당
- Resolving : 클래스의 상수 풀 내 모든 symbolic reference를 direct reference로 변경한다.
- Initialization : 클래스 변수를 적절한 값으로 변환
💡 symbolic references란?
- 참고하는 클래스의 특정 메모리 주소를 참조 관계로 구성한 것이 아닌 참조하는 대상의 이름으로 참조하는 것
💡 direct references란?
- 참조하는 클래스의 특정 메모리 주소를 참조하는 것
🍄 Execution Engine (실행 엔진)
Class Loader
를 통해 runtime Data Area
에 배치된 바이트 코드를 명령어 단위로 읽어서 실행한다.
- Interpreter
- Jit Compiler (Just-In-Time Compiler)
- 느린 Interpreter 방식을 해결하기 위하여 여러번 반복되는 코드를 발견하여 바이트 코드 전체를 컴파일하여 Native Code로 변경한 후, 해당 코드를 실행할 때, 네이티브 코드를 직접 실행한다.
- GC (Garbage Collector)
- Heap 메모리 영역의 더는 사용하지 않는 메모리를 자동으로 회수한다.
💡 네이티브 코드란
- JAVA에서 부모가 되는 C언어나, C++, 어셈블리어로 구성된 코드를 의미한다.
🍄 Runtime Data Areas
- PC 레지스터
- 다음 명령어의 주소
- Stack Area
- 지역변수 저장
- Native Method Stack
- 자바 외 언어로 작성된 코드를 위한 영역
- heap
- 객체 저장
- Method Area
- static 변수 저장
- static 변수 저장
개인 공부 기록용 블로그입니다.
틀리거나 오류가 있을 경우 제보해주시면 감사하겠습니다.😁