[Java] - JVM Series2 구조 & 클래스 로더와 실행 엔진 #117
Unanswered
Irisation23
asked this question in
Java
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Table of contents generated with markdown-toc
0. 핵심요약 📚
1. 클래스 로더와 실행 엔진의 도식
아래의 그림은 JVM 동작 과정 중 Class Loader <-> Execution Engine <-> Runtime Data Area 부분을 좀 더 상세화 한 도식이다.
JVM은 아래와 같이 구성되어 있다.
클래스 로더(Class Loader)
실행 엔진(Execution Engine)
런타임 데이터 영역 (Runtime Data Area)
JNI - 네이티브 메소드 인터페이스 (Native Medthod Interface)
네이티브 메서드 라이브러리 (Native Method Library)
이중 해당 정리에서는
클래스 로더
와실행 엔진
에 대해 다루도록 하겠다.2. 클래스 로더 (Class Loader)
클래스 로더는 JVM 내로 클래스 파일(*.class)을
동적으로 로드
하고,링크
를 통해배치
하는 작업을 수행하는 모듈이다.즉, 로드된 바이트 코드(.class)들을 엮어서 JVM의 메모리 영역인 Runtime Data Areas에 배치한다.
클래스를 메모리에 올리는 로딩 기능은 한번에 메모리에 올리지 않고, 어플리케이션에서 필요한 경우 동적으로 메모리에 적재하게 된다.
클래스 파일의 로딩 순서는 다음과 같이 3단계로 구성된다. (Loading -> Linking -> Initialization)
이중 Linking은 검증 -> 준비 -> 분석이라는 과정을 한번 더 거친다.
i. Verifying(검증): 읽어들인 클래스가 JVM 명세에 명시된 대로 구성되어 있는지 검사한다.
ii. Preparing(준비): 클래스가 필요로 하는 메모리를 할당한다.
iii. Resolving(분석): 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경한다.
3. 실행 엔진 (Execution Engine)
실행 엔진은 클래스 로더를 통해 런타임 데이터 영역에 배치된 바이트 코드를 명령어 단위로 읽어서 실행한다.
자바 바이트 코드(*.class)는 기계가 바로 수행할 수 있는 언어보다는 가상머신이 이해할 수 있는 중간 레벨로 컴파일 된 코드이다.
실행 엔진은 이와 같은 바이트 코드를 실제로 JVM 내부에서 기계가 실행할 수있는 형태로 변경해준다.
해당 수행 과정에서 실행 엔진은 인터프리터와 JIT 컴파일러 두 가지 방식을 혼합하여 바이트 코드를 실행한다.
3.1 인터프리터(Interpreter)
바이트 코드 명령어를 하나씩 읽어서 해석하고 바로 실행한다.
JVM 안에서 바이트 코드는 기본적으로 인터프리터 방식으로 동작한다.
다만 같은 메서드가 여러번 호출되면 매번 해석하고 수행해야 되서 속도가 느리다.
3.2 JIT 컴파일러(Just-In-Time Compiler)
인터프리터의 단점을 보완하기 위해 반복되는 코드를 발견하여 바이트 코드 전체를 컴파일하여 Native Code로 변경하고 이후에는 해당 메서드를 더 이상
인터프리팅 하지 않고
캐싱
해 두었다가 네이티브 코드로 직접 실행 하는 방식이다.하지만 Native Code의 변환에도 비용이 들기 때문에 인터프리터와 JIT 컴파일러는 복합적으로 사용한다.
3.3 가비지 컬렉터(Garbage Collector)
JVM은 가비지 컬렉터를 이용해 Heap 메모리 영역에서 더는 사용하지 않는 메모리를 자동으로 회수한다.
GC는 이전 #42 를 참조해보자.
4. 회고 🧹
2023-03-20 월
인파
라는 분의 블로그가 굉장히 많은 도움이 되고있고 나중에 감사인사라도 하나 남기려한다.Beta Was this translation helpful? Give feedback.
All reactions