Java
JVM (1)
move2
2022. 11. 30. 17:07
1.JDK
자바 가상 머신(Java Virture Machine)에 대해서 설명하기전에 JDK에 대해서 알고 가야한다.
JDK는 Java Development Tool + JRE이다.
자바 개발자용 도구들과 JRE를 포함하고 있다.
JRE는 Java Runtime Environment + JVM 이다.
JRE에는 다음과 같이 자바에서 제공되는 기본 라이브러리들이 포함된다.
JVM은 JRE에 속해있다.
2.JVM
2-1. 자바에서 코드의 실행
코드가 실행될때, JVM은 다음의 그림과 같은 역할을 한다.
2-2. JVM의 구조
- 클래스 로더 서브시스템
- .class 에서 바이트코드를 읽고 메모리에 저장.
- 메모리
- 메소드 영역(Method Area).
- 힙 영역에는 객체를 저장.
- 스택 영역에는 스레드마다 런타임 스택을 만들고, 스택 프레임이라 부르는 블록을 쌓는다.
- 실행엔진
- JIT 컴파일러가 반복되는 코드를 재사용해서 속도를 높인다.
- GC : 더이상 참조되지 않는 객체를 모아서 정리한다.
- JN(Java Native Interface)
- C, C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법 제공.
- 자바에서 기본으로 제공되는 메서드에 native 키워드를 가 붙은 친구.
- 네이티브 메소드 라이브러리.
- C, C++로 작성된 라이브러리.
2-2-1. 클래스 로더와 스태틱 영역
컴파일된 자바의 바이트 코드를 제일 먼저 받아 처리하는 Class Loader Subsystem에 대해서 알아보자.
간단하게 Class Loader Subsystem은 Loading, Linking, Intialization 과정으로 나뉜다.
- Loading
- 클래스 로더가 .class 파일을 읽고 데이터를 “Method Area”영역에 저장한다.
- 메소드 영역에 저장하는 데이터들
- FQCN(Fully Qualified Class Name) : package를 포함한 Class이름
- → java.lang.String
- 클래스 | 인터페이스 |
- 메소드와 변수
- 메소드 영역에 저장하는 데이터들
- 클래스 로더가 .class 파일을 읽고 데이터를 “Method Area”영역에 저장한다.
- Linking
- Linking에서는 로드된 클래스나 인터페이스, 그 직계 부모클래스나 인터페이스, 필요한 경우 요소 타입(배열 타입인 경우)을 검증하고, 준비하고, 해석하는 과정을 거친다.
- Linking 검증, 준비, 해석(Verify, Prepare, Resolve)의 단계로 나누어져 있다.
- Linking에서는 로드된 클래스나 인터페이스, 그 직계 부모클래스나 인터페이스, 필요한 경우 요소 타입(배열 타입인 경우)을 검증하고, 준비하고, 해석하는 과정을 거친다.
- Instalization
- 각 클래스나 인터페이스의 초기화 로직이 실행된다. 클래스의 위에서 아래로, 클래스 계층 구조에서 부모에서 자식까지 한 줄씩 실행된다.?? Static의 초기화
2-2-2 메모리 영역
- Method Area 는 클래스 영역 또는 스태틱 영역이라고 한다.
- Stack 영역은 Thread 영역이라고 한다.
- 메모리를 이용하는 방식
- 데이터 저장 영역 세분화
- → 스태틱 영역 : 클래스와 static 친구들
- → 힙 영역 : 객체(Instance)들
- 🔍 그 main(String[] args)
- JRE 는 psvm 메서드가 있는지 먼저 찾는다.
- psvm 존재 == true → JRE 는 JVM 부팅
- 부팅된 JVM은 바이트파일(.class) 실행JVM 전처리
java.lang 패키지 로드 : 데이터 저장 영역의 Static 영역에 올린다.
개발자가 작성한 클래스와 import package를 데이터 저장 영역의 Static 영역에 올린다.
데이터 저장 영역의 Stack 영역에 main() 스택 프레임이 올라간다.