1️⃣ JVM?
Java Virtual Machine 자바 가상 머신으로, Java와 OS 사이에서 기능하며 Java가 OS 종속적이지 않도록 해준다.
특징
- 컴파일된 바이트 코드(.class)를 기계가 이해할 수 있는 기계어로 변환
- 스택 기반의 가상 머신
- 메모리 관리와 GC를 수행
- 네트워크 바이트 오더 - 빅 엔디안 방식을 사용
구조
Class Loader
클래스 파일을 Runtime Data Area의 메서드 영역으로 불러오는 역할
- Loading: 클래스 파일 JVM의 메모리에 로드
- Linking: 클래스 파일 검증
- Initialization: 클래스 변수들 적절한 값으로 초기화
jar 파일 내 저장된 클래스들을 JVM 위에 탑재한다.
클래스를 처음 참조할 때 해당 클래스를 로드하고 링크하는 역할을 한다.
Link
- veryfying(검증): 읽어들인 클래스가 JVM 명세에 명시된 대로 구성되어 있는지 검사
- preparing(준비): 클래스가 필요로 하는 메모리 할당
- Resolviong(분석): 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경
Execution Engine
바이트 코드를 실행 가능하도록 해석
Interpreter, JIT Compiler, Garbage Collector
Runtime Data Area
클래스 데이터와 같은 메타 데이터와 실제 데이터가 저장되는 곳
메서드영역 참고
2️⃣ JIT Compiler
Just In Time, JIT Compiler는 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일러로 동적 번역이라고도 한다. 인터프리터 방식의 단점을 보완하기 위해 도입되었다. 인터프리터는 바이트 코드를 한 줄 한 줄 해석하여 실행하지만, JIT 컴파일러는 전체를 바이너리 코드로 직접 실행한다. 따라서 JIT 컴파일러가 컴파일하는 과정은 인터프리팅하는 것보다 오래걸리므로 한 번만 실행되는 코드라면 컴파일 하지 않고 인터프리팅 하는 것이 유리하다. 따라서 수행 빈도를 체크 후 일정 수치를 넘으면 컴파일을 실행한다. 컴파일된 기계어 코드는 캐시에 보관되기 때문에 한 번 컴파일된 코드는 빠르게 수행될 수 있다.
3️⃣ Garbage Collector
42에서 c만 공부하다가 처음 java를 공부하며 가장 놀라웠고 쩌는 기능이라 생각했던 GC!
Minor GC, Major GC
대명제 객체는 대부분 일회성이며, 메모리에 오랫동안 남아있는 경우는 드물다
=> Young, Old 영역으로 나누자
Young 영역
- 새롭게 생성된 객체가 할당되는 영역
- 많은 객체가 다시 재참조 되는 일이 드물어 Young 영역에서 생성되었다가 사라짐
- Young 영역에 대한 GC를 Minor GC라 한다
Old 영역
- Young 영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
- Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생
- Old 영역에 대한 GC를 Major GC라 한다
수명이 짧은 객체들은 대체로 큰 공간을 필요로 하지 않으며, 큰 객체들은 Young 영역이 아니라 바로 Old 영역에 할당 된다
Card Table
- Old 영역에 있는 객체가 Young 여역의 객체를 참조할 때 정보가 표시되는 영역
- Young 영역에서 Minor GC가 실행될 때 모든 Old 영역에 존재하는 객체를 검사하여 참조되지 않은 객체를 식별하는 것이 아니라, 카드 테이블을 조회하여 GC의 대상인지 식별할 수 있도록 함
동작 방식
1. Stop The World
- GC 수행을 위해서 JVM이 어플리케이션의 실행을 멈춤
- GC가 실행될 때 GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업이 중단되었다가 GC가 끝나면 작업이 재개됨
- GC의 성능 개선을 위해 튜닝을 하는 경우 보통 이 시간을 줄이기 위한 작업을 하는 것
2. Mark and Sweep
- Mark: 사용되는 메모리와 사용되지 않는 메모리 식별
- Sweep: Mark 단계에서 사용되지 않음으로 식별된 메모리 해제
Minor GC
- Eden 영역: 새로 생성된 객체가 할당되는 영역
- Survivor 영역: 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역
1개의 Eden 영역과 2개의 Survivor 영역으로 이루어짐
- 새로 생성된 객체가 Eden 영역에 할당
- Eden 영역이 꽉차게 되면 Minor GC가 실행
- Eden 영역에서 사용되지 않는 객체의 메모리 해제
- Eden 영역에서 살아남은 객체는 1개의 Survivor 영역으로 이동
A. Survivor 영역이 꽉차게 되면 Survivor 영역에서 살아남은 객체를 다른 Survivor 영역으로 이동 (1개의 Survivor 영역은 무조건 빈 상태)
B. 계속해서 살아남은 객체는 Old 영역으로 Promotion 됨
객체의 생존 횟수를 카운트 한 age를 Object Head에 기록
Major GC
객체들이 계속 Promotion 되어 Old 영역 메모리가 부족해지면 발생
두 영역을 모두 처리하는 GC는 Full GC라 한다.
4️⃣ JDK, JRE
JDK: Java Development Kit
- Java를 사용하기 위해 필요한 기능을 갖춘 Java용 SDK(Software Develoment Kit)
- JRE를 포함하고 있음
- 컴파일러(javac: .java -> .class), jdb, javadoc 등 포함
- 프로그램 생성, 실행, 컴파일 가능
JRE: Java Runtime Environment
- JVM + Java Class Library 등으로 구성
- 컴파일 된 Java 프로그램을 실행하는데 필요한 패키지