JAVA - JVM에 대하여

박진형·2021년 7월 28일
0

JVM이란?

Java Virtual Machine(자바 가상 머신)의 약자.
자바 바이트 코드를 실행할 수 있는 주체. 자바 바이트 코드는 플랫폼에 독립적이므로 OS에 상관없이 JVM이 바이트코드를 OS에 따라 기계어로 해석하여 실행 시켜준다. 덕분에 OS를 고려하지 않아도 JAVA코드로 프로그래밍만 한다면 JAVA 애플리케이션을 만들고 실행할 수 있다.
JVM은 크게 Class Loader, Runtime Data Areas, Execution Engine 3가지로 구성되어있다.

JVM의 구조


ref - https://www.educba.com/what-is-jvm/

Class Loader

.java 파일이 자바 컴파일러에 의해 .class(바이트 코드)로 컴파일되고 Class Loader가 운영체제에 의해 메모리를 할당 받은 Runtime Data Area로 적재하는 역할을 한다.

Runtime Data Areas

JVM이 OS로 부터 별도로 할당 받은 메모리 공간으로 Method Area, Stack Area, PC registers, Native Method Area, Heap 5가지로 구분된다.

- Method area

필드, 메서드, 클래스인지 인터페이스인지에 등 클래스에 관한 정보, Static 변수, 상수, final 변수 등 한번 로드 된 후 메모리에 항상 상주하고 있는 영역, 모든 스레드가 공유한다.

- Stack Area

지역 변수, 매개 변수, 리턴 값, 참조 변수일 경우 주소 값 등이 저장된다.
스레드 마다 하나씩 존재하며 자료구조의 Stack과 같이 메서드 호출과 종료에 따라 LIFO 형식으로 push, pop 된다.

- PC registers

Register Base가 아닌 Stack Base로 PC Register는 각 Thread 별로 하나 씩 존재하며 현재 수행중인 명령어의 주소를 가진다.

- Native Method Area

자바 언어가아닌 다른 언어로 작성된 네이티브 코드를 수행하기 위한 메모리 영역

- Heap

객체(instance)들을 위한 영역, new를 통해 생성된 객체, 배열 immutal 객체 등의 정보 저장 Garbage Collector에 의해 관리되는 주요 메모리 영역
Garbage Collector는 더 이상 사용되지 않는 객체들을 제거하는 역할을 한다. GC를 실행하는 동안 GC를 실행하는 스레드 외 모든 스레드가 일시정지 된다.

Execution Engine

Class Loader를 통해 JVM내의 Runtime Data Areas에 배치된 바이트 코드는 Execution Engine에 의해 기계어로 번역되어 실행된다.
초기의 JVM은 Interpreter 방식만 존재 했었는데 이 방식은 한줄씩 해석하고 실행하는 방식이기 때문에 속도가 느리다는 단점이 있었다.
이러한 단점을 JIT Compiler 방식을 통해 극복했다.
JIT Compiler는 Runtime시에 바이트 코드를 모두 기계어로 컴파일해 실행하고 캐시를 사용하여 한번 사용한 코드는 다음번에 사용할 때 다시 캐시에서 가져와 사용할 수 있도록 한다. (성능이 빠름)
JVM은 처음엔 Interpreter 방식으로 해석을 하다가 적절한 시기에 JIT Compiler를 통해 컴파일을 한다.

*Garbage Collector의 자세한 포스팅은 추후에 하기로 함.

0개의 댓글