JVM (Java Virtual Machine)
- 환경, 플랫폼에 독립적이다. (운영체제 + CPU 아키텍쳐)
- 프로그램 메모리를 관리하고 최적화한다.
과정
Java 컴파일러가 .java 파일을 .class라는 java 바이트 코드로 변환시켜 준다.
Class Loader를 통해 class 파일들을 JVM으로 로딩한다.
OS가 바이트코드를 이해할 수 있도록 해석해준다.
해석된 바이트 코드는 Runtime Data Area에서 실질적인 수행을 이루어진다.
Class Loader
JVM내로 클래스(.class 파일)를 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈. Runtime 시점에 클래스를 로드한다.
Runtime Data Area
1) Method Area
모든 스레드가 공유하는 영역으로 JVM이 시작될 때 생성된다. 바이트 코드의 모든 데이터가 올라가는 영역이다. 클래스 데이터를 위한 공간이다.
2) Heap
모든 스레드가 공유하는 영역으로 객체를 위한 공간이다. Method Area에 있는 클래스들로만 객체로 생성할 수 있다.
Eden: 객체들이 최초로 생성되는 공간, Suvivor 0/1: Eden에서 참조되는 객체들이 저장되는 공간
※ GC (Garbage Collection)
자바 이전에는 프로그래머가 모든 프로그램 메모리를 관리했었다. 하지만 JVM을 통해 자바 프로그램에서 사용되지 않는 메모리를 지속적으로 찾아내서 제거한다.
Minor GC
Eden 영역에 객체가 가득 차게 되면 첫번째 GC가 발생한다. Eden 영역에 있는 값들을 Survivor 1에 복사하고 이 영역을 제외한 나머지 영역의 객체를 삭제한다. 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동시킨다.
Major GC
Old 영역에 있는 모든 객체들을 검사하여 참조되지 않은 객체들을 한꺼번에 삭제한다. 이때 실행 중인 프로세스가 정지된다.(stop-the-world) Major GC가 발생하면 GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업을 멈춘다.
3) PC
스레드마다 하나씩 존재하며, 현재 수행 중인 JVM 명령의 주소를 갖는다.
4) JVM stack
스레드마다 하나씩 존재하며, 메소드 호출 시마다 생기는 스택 프레임이라는 구조체를 저장하는 스택이다. 스택 프레임에는 각 메소드 안에서 사용되는 값들을 저장한다. 메소드 수행이 끝나면 프레임은 삭제된다.
5) Native Method stack
Java 외의 언어로 작성된 네이티브 코드를 위한 스택이다.
Execution Engine
바이트코드를 실제로 JVM내부에서 두가지 방식으로 기계가 실행할 수 있는 형태로 변경한다.
Interpreter
바이트 코드를 명령어 단위로 읽어서 한줄씩 실행한다.
JIT (Just-In-Time)
인터프리터 방식의 단점을 보완한다. 적절한 시점에 바이트 코드 전체를 컴파일 하여 네이티브 코드로 변경하고, 이후에는 네이티브 코드로 직접 실행하는 방식이다. 내부적으로 해당 메소드가 얼마나 자주 수행되는지 체크하고, 일정 정도를 넘을 때에만 컴파일을 수행한다.
참조
https://asfirstalways.tistory.com/158
https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2
'개발 > CS' 카테고리의 다른 글
[CS] 데이터베이스 (0) | 2021.08.10 |
---|---|
[면접 준비] 객체 지향 (0) | 2021.04.23 |
[CS] 자료구조 (0) | 2020.07.23 |
최근댓글