2022. 1. 18. 16:42ㆍLanguage`/Java
JVM (Java Virtual Machine)
- 자바 ↔ 운영체제 사이에서 중개자 역할
- 운영체제에 상관없이 프로그램을 실행할 수 있게 해준다 → JVM은 운영체제에 종속적
- 가비지 컬렉터(GC)를 사용해서 메모리 관리를 자동으로 수행
- Stack 기반으로 동작
- (Garbage Collector / Execution Engine / Class Loader / Runtime Data Area) 4가지 구조로 나눌 수 있다
- 최초 JVM이 나왔을 당시에는 인터프리터 방식이어서 속도가 느렸지만, JIT 컴파일러 방식을 통해서 보완
- JIT : Byte Code를 어셈블러 같은 네이티브 코드로 바꿈으로써, 실행이 빠르지만 비용이 발생
- JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정 기준이 넘어가면 JIT 컴파일러 방식으로 실행
1. 자바 컴파일러에 의해 링크 과정 없이 Java Code → Byte Code로 변환
2. 해당 Byte Code를 JVM을 통해 실행 → Byte Code는 JVM에서만 실행 가능하다
JVM 메모리 구조
- 자바 소스파일이 자바 컴파일러에 의해 바이트 코드 형태인 클래스 파일로 변환
- 이 클래스 파일은 Class Loader가 읽어들이면서 JVM이 수행
(1) Class Loader
- JVM안에 Runtime Data Area로 클래스 파일을 로드
- 링크 작업을 통해서 배치하는 작업을 수행
- 런타임 시에 동적으로 클래스를 로드
(2) Execution Engine
- Class Loader를 통해서 Runtime Data Area에 로드된 Byte Code들을 명령어 단위로 읽어서 실행
(3) Garbage Collector
- Heap Memory Area에 생성된 객체들 중에서 참조되지 않거나 null인 객체의 Memory를 해체시켜서 반납
- GC의 수행 시간은 언제인지 정확히 알 수 없다
(4) Runtime Data Area
- JVM의 Memory Area
- 자바 Application을 실행할 때 사용되는 Data들을 적재하는 영역
- (Method(Static) Area / Heap Area / Stack Area / PC Register / Native Method Stack)으로 나눌 수 있다
▶ Method(Static) Area
- 모든 Thread가 공유하는 Memory Area
- JVM 시작 시 생성
- (Class / Interface / Method / Field[Static 변수, 전역 변수]) 등의 Byte Code를 보관
- Method Area의 Data들은 프로그램 시작 ~ 종료까지 Memory에 남아있는다
▶ Heap Area
- 모든 Thread가 공유하는 Memory Area
- 런타임 시 동적으로 할당해서 사용하는 Memory Area
- new 키워드로 생성된 객체, 인스턴스 변수, 배열이 생성되는 영역
- Method Area에 로드된 Class만 생성 가능
- GC가 참조되지 않는 메모리를 확인하고 제거하는 영역
▶ Stack Area
- Method 호출 시마다 각각의 Stack Frame을 생성 (해당 Method만을 위한 공간)
- Method내에 지역변수의 Data값이 저장
- 호출된 Method의 매개변수/지역변수/리턴값/연산 시 임의의 값들을 임시로 저장
- Method 수행이 끝나면 Frame별로 삭제
▶ PC Register
- Thread가 시작될 때 생성
- 생성될 때마다 생성되는 공간으로 Thread마다 하나씩 존재
- Thread가 어떤 부분을 무슨 명령으로 실행해야 할지 기록
- 현재 수행중인 JVM 명령의 주소를 보유
▶ Native Method Stack
- Java 외 언어로 작성된 Native Code를 위한 Memory Area
※ 전역변수, static 변수 = Method(Static) Area에 저장
※ 지역변수 = Stack Area에 저장
※ Heap 영역에 존재하는 Object 멤버(객체, 배열, 인스턴스)들은 자동 초기화가 된다
- String name → null로 초기화
- int age → 0으로 초기화
- int [] arr → null로 초기화
- boolean flag → false로 초기화