JVM이란?
JVM(Java Virtual Machine)은 자바를 실행하기 위한 가상 기계로 Java의 특징 중 하나인 OS에 종속받지 않고 사용할 수 있는 특징을 가능하게 해주는 도구이다.
JVM이 Java와 OS사이에서 중개자 역할을 수행하기 때문에 Java가 OS에 종속받지 않고 사용을 가능하게 해준다.
그리고 메모리 관리(Garbage Collection)도 수행한다.
JVM 구성 요소
Class Loader
Class Loader는 클래스 파일(.class file)을 JVM이 OS로 부터 할당받은 메모리 영역(Runtime Data Area)으로 로딩하는 역할을 한다.
Execution Engine
클래스 로더가 메모리(Runtime Data Area)에 클래스 파일들을 적재시켰다면 실행 엔진은 런타임 데이터 영역에 배치된 바이트 코드들을 실행시키는것이 실행 엔진의 역할이다. 여기서 Interpreter 방식과 JIT compiler방식 두 가지를 사용하게 된다.
Interpreter
인터프리터는 명령어를 한 줄씩 실행한다. 한 줄씩 수행하기 때문에 수행 속도가 느리다는 단점을 갖고 있다.
JIT Compiler (Just In Time Compiler)
인터프리터의 단점을 보완하기 위해 등장한것이 JIT Compiler 방식이다. JIT컴파일러는 인터프리터 방식으로 실행하다 적절한 시간에 전체 바이트 코드를 네티이브 코드로 변경한다. 이후 인터프리터 방식으로 실행하지 않고 네이티브 코드로 실행을한다. 한 번 컴파일된 코드는 빠르게 수행된다는 이점이 있다. Execution Engine이 네이티브로 컴파일된 코드를 실행하는 것으로 성능을 높이는 방식이다.
Garbage Collector(가비지 컬렉터)
heap 메모리 영역에 생성된 객체들 중에 참조되지 않는 객체들을 찾아 정리하는 역할을 한다.
GC는 언제 일어날지 모르며 ,GC가 수행하는 동안 다른 모드 쓰레드가 일시정지하는 STW(Stop the World)가 발생하게 된다.
GC에 대한 내용
https://seungjjun.tistory.com/225
Runtime Data Area
Runtime Data Area는 JVM의 메모리 영역으로 프로그램을 수행하기 위해 OS로부터 할당받은 메모리 영역을 말한다.
총 5가지 영역으로 나뉜다.
1. Method Area
Method Area는 모든 Thread에서 공유하는 메모리 영역으로 클래스 멤버 변수의 이름, 데이터 타입, 접근제어자 정보같은 필드 정보와 메소드의 이름 리턴타입, 파라미터, 접근 제어자 같은 메소드 정보, Type정보, Constant Pool, static 변수, final Class 변수등이 생성되는 영역으로 JVM당 하나만 생성된다는 특징이 있다.
2. Heap
Heap 영역은 new 키워드로 생성된 객체들이 저장되는 영역이다. Heap영역도 JVM당 하나만 생성된다는 특징이 있고, 해당 영역이 갖고 있는 데이터는 모든 Thread에서 공유가 된다. Heap에서는 참조되지 않는 객체 또는 배열에 대한 정보를 얻을 수 있기 때문에 GC가 참조되지 않는 메모리를 확인하고 제거하는 영역이다.
3. PC Register
Thread가 생성될때마다 생성되는 영역(Thread당 PC Register가 1개씩 존재)으로 Program Counter 입니다. 현재 수행 중인 JVM Instruction의 주소를 가지게 되어 Thread가 어떤 부분을 어떤 명령으로 실행할지에 대한 기록을 하는 부분이다.
CPU에 있는 레지스터와 다르다는 점을 주의하자
4. Java Stack
Java Stack은 Thread마다 하나씩 할당되는 영역이다. 각 Thread들은 메소드 호출 시마다 각각의 Frame(해당 메서드만을 위한 공간)이라는 단위가 Stack에 생성(push)된다.
메서드 수행이 끝나면 해당 Frame은 Stack에서 제거(pop)된다. Frame은 메소드에 대한 정보(매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값)를 갖고 있다.
5. Native Method Stack
Native Method Stack은 자바가 아닌 다른 언어로 작성된 네이티브 코드를 위한 메모리 영역입니다. 다른 언어로 작성된 메소드를 Native Method 라고 한다. Java Stack과 비슷하게 Native Method가 실행될 경우 Stack에 메서드가 쌓이게 된다.
Reference
https://www.baeldung.com/java-stack-heap
https://tecoble.techcourse.co.kr/post/2021-08-09-jvm-memory
'Java' 카테고리의 다른 글
[Java] Call By Reference와 Call By Value (0) | 2023.01.09 |
---|---|
가비지 컬렉션(Garbage Collection)이란? (0) | 2023.01.03 |
배열 (0) | 2022.05.22 |
반복문 - for문 (0) | 2022.05.22 |
조건문 (0) | 2022.05.15 |