JVM은 Java Virtual Machine의 약자로, 자바 가상 머신이라고 부릅니다. 그리고 자바와 운영체제 사이에서 중개자 역할을 수행하며, 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 도와줍니다. 또한, 가비지 컬렉터를 사용한 메모리 관리도 자동으로 수행하며, 다른 하드웨어와 다르게 레지스터 기반이 아닌 스택 기반으로 동작합니다.
JVM의 구조는 크게 보면, Garbage Collector, Execution Engine, Class Loader, Runtime Data Area로, 4가지로 나눌 수 있습니다.
자바 소스 파일은 자바 컴파일러(javac)에 의해 java file 이 class file로 변환해 주면서 JVM이 실행 됩니다.
(1) Class Loader(클래스 로더)
JVM 내로 클래스 파일(.class)을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈입니다. 런타임 시에 동적으로 클래스를 로드합니다.
(2) Execution Engine(실행 엔진)
클래스를 실행시키는 역할이다. 클래스 로더를 통해 JVM 내의 런타임 데이터 영역(Runtime Data Area)에 배치된 바이트 코드들을 명렁어 단위로 읽어서 실행합니다. 자바 바이트코드는 기계가 바로 수행할 수 있는 언어보다는 인간이 보기 편한 형태로 기술된 것이므로 실행 엔진이 바이트코드를 JVM 내부에서 기계어로 변형하게 된다. 이때 두가지 방식이 있다.
최초 JVM이 나왔을 당시에는 인터프리터 방식이었기때문에 속도가 느리다는 단점이 있었지만 JIT 컴파일러 방식을 통해 이 점을 보완하였습니다. JIT는 바이트 코드를 어셈블러 같은 네이티브 코드로 바꿈으로써 실행이 빠르지만 역시 변환하는데 비용이 발생하였습니다. 이 같은 이유로 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 실행합니다.
interpreter(인터프리터)
실행 엔진이 자바 바이트 코드를 명령어 단위로 읽어 실행한다. 한 줄 씩 수행하기 때문에 느리다.
(3) Garbage Collector(GC, 가비지 콜렉터)
Garbage Collector(GC)는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 합니다. 이때, GC가 역할을 하는 시간은 언제인지 정확히 알 수 없습니다.
(4) Runtime Data Area
JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다. 이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있습니다.
1. Method area
모든 쓰레드가 공유하는 메모리 영역입니다. 클래스 정보를 처음 메모리 공간에 올릴 때 초기화 되는 대상을 저장 하기 위해 있는 메모리 공간. 메소드 영역은 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관합니다.
올라가는 정보의 종류
1)Field Information
멤버 변수의 이름, 데이터 타입, 접근 제어자에 대한 정보
2) Method Information
메소드의 이름, 리턴타입, 매개변수, 접근제어자에 대한 정보
3) Type Information
class 인지 interface 인지의 여부 저장 /Type의 속성, 전체 이름, super class의 전체 이름(interface 이거나 object인 경우 제외)
2. Heap area
객체를 저장하는 가상 메모리 공간. 모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역입니다. 또한, 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역입니다.
3. Stack area
프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터(stack)을 저장하기 위한 영역.
메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성합니다. 그리고 메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장합니다. 마지막으로, 메서드 수행이 끝나면 프레임별로 삭제합니다.
4. PC Register
쓰레드가 시작될 때 생성되며, 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재합니다. 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖습니다.
5. Native method stack
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역입니다.
'JAVA > 개념' 카테고리의 다른 글
JAVA 리터럴(literal) (0) | 2021.12.30 |
---|---|
JAVA Data Type(데이터 타입), 프리미티브, 레퍼런스 (0) | 2021.12.30 |
JIT 컴파일러란 ? (0) | 2021.12.28 |
바이너리 코드 ? 바이트 코드? 무엇인가! (0) | 2021.12.28 |
JDK 와 JRE 가 뭐지? 차이점! (0) | 2021.12.28 |