[사진 출처] 위키피디아
JVM이란?
자바 바이트코드를 실행할 수 있는 주체 (OS위에서 동작)
JVM을 두는 이유는 무엇일까? (=장점)
- OS에 종속받지 않고, 바이트 코드를 실행할 수 있다. (-> 컴파일된 파일만 가지고, 다른 OS에서 실행 가능)
Java 실행 과정
- 프로그래머가 파일 작성 (*.java 파일 생성)
- 자바 컴파일러로 컴파일 (*.class 바이트 코드 파일 생성)
- JVM의 Class Loader가 동적으로 클래스를 읽어와 인터프리트 형식으로 코드 실행
- 어느 정도 자주 사용되는 기능은 JIT 컴파일러로 컴파일되고, 기계어로 직접 수행
구성 요소
ClassLoader
Class 파일을 동적으로 로드하고, 링킹(Linking)하는 작업 담당
JVM Memory
- Method Area : 클래스 멤버 변수의 이름, 데이터 타입, 필드 정보, 메서드 정보, 데이터 Type 정보, Constant Pool, static변수, final class 등이 생성되는 영역
- Heap : 객체 및 배열이 생성되는 영역
- Stack : 지역 변수, 파라미터 등 임시로 사용되는 변수들이 생성되는 영역
- PC Registers : 스레드의 정보(실행되는 부분의 주소 및 명령)를 저장하고 있는 영역
- Native Method Stack : 네이티브 코드를 실행할 때 사용되는 영역
Execution Engine
- Method Area의 바이트 코드 실행을 담당
Garbage Collector
- Heap 메모리 영역에 생성된 객체 중 unreacheable한 객체를 수집하고, 메모리 해제 담당
- ex) Serial GC, Parallel GC, CMS GC, G1GC, ZGC...
GC(가비지 컬렉터)
GC는 Mark And Sweep 과정과 필요에 따른 Compact과정이 추가된다.
- Mark 과정 : Root space로 부터 순회하여, unreachable 객체와 reacheable 객체를 구분하여 마킹
- Sweep 과정 : Unreachable한 객체의 메모리 할당을 해제
- Compact 과정 : Heap 구조의 빈공간을 당겨서 압축시키는 과정
Minor GC : 비교적 가장 최근에 사용된 객체들의 메모리를 할당 해제 하는 것
Major GC : 오래 살아남은 객체의 메모리 할당을 해제하는 것
- Young Generation (Eden, Survaival), Old Generation으로 나뉨
종류
- Serial GC : GC를 처리하는 스레드가 1개, 1코어 CPU일때 사용
- Parallel GC : Minor GC를 멀티 스레드로 수행
- Parallel Old GC : Major GC도 멀티 스레드로 수행
- CMS GC : GC 파악을 여러 과정으로 나뉘어서 실행
- G1 GC : Region 개념을 부여, 고정된 영역, 영역별로 GC 실행
- ZGC : Region이 가변적임