1. JVM
JAVA와 OS사이에 중재자 역할을 해주면서 재사용성을 증가시킴
스택기반의 가상머신, 메모리관리 및 GC를 수행함
- 실행시 JVM은 OS에서 필요한 메모리를 할당받는다.
- javac(Java Compiler)가 .java파일을 .class파일(Byte Code)로 변화시킨다
- Class Loader가 런타임 시점에 Class파일을 JVM으로 로딩한다
- 로딩된 Class파일은 Execution Engine을 통해 해석된다
- 해석된 코드는 Runtime Data Area로 이동하여 실행된다.
- 실행 간에 지속적으로 메모리 관리가 이루어진다.
2. JVM의 요소
Class Loader
class 파일 / ByteCode를 메모리에 로드한다. 객체가 생성되는 과정이라고 볼 수 있다?
상속이 된다.
load 요청의 위임 -> 클래스 요청을 받을 때,
Garbage Collector
Java는 C처럼 사용자가 직접 메모리 관리를 하지 않고, JVM이 알아서 대신 해준다.
필요하다고 여겨질 때, mark & sweep을 통하여 메모리를 정리한다.
이 때, Stop the World가 일어나서 성능에 영향이 발생하므로 최대한 적게 발생하도록 설계해야한다.
Excution Engine
위의 class loader를 통하여 로드된 Byte Code / Class 파일을 해석하고 실행시키는 역할을 한다.
인터프리터 방식과 Just in Time 방법 두가지가 사용이 된다.
Runtime Data Area
실행을 위해 메모리에게 미리 할당받은 공간을 의미하며, 사용성에 따라서 5개의 공간으로 분류할 수 있다.
스택 -> 함수 콜 -> 리턴 시 바로 팝
힙 -> 큐로 진행 / 순서를 예측할 수 없으므로 / 정렬에 이점이 있음
3. compiler
위에서 서술한 javac(Java Compiler)가 .java파일을 .class파일로 변화시킨다에 해당된다.
4. Interpreter vs Just in Time
인터프리터 방식의 해석 및 실행과정은 한 줄씩 읽어서 해석 후 실행시키는 방법을 의미한다.
이 때, 한 줄씩 읽어서 해석시킨다면 메소드가 다시 호출되었을 때, 중복하여 해석하므로 성능에 누수가 발생한다.
이러한 성능 누수를 방지하기 위하여 한 줄씩 해석하며 해석된 코드를 캐싱한다.
이렇게 캐싱된 코드는 같은 메소드가 호출되었을 때, 재사용되며 중복 해석하는 문제를 방지한다.
'Java & Kolin' 카테고리의 다른 글
Sentry에서 Cron 모니터링이 가능하다는 사실 (1) | 2024.10.14 |
---|---|
M1 사용기 - JVM환경에서 ARM / Rosetta 번역 알아내기 (0) | 2021.10.10 |
Garbage Collection (0) | 2021.04.04 |
Kotlin의 Generic - 기본문법 (0) | 2021.03.03 |
Spring 오류 / The signing key's size is 240 bits which is not secure enough for the HS256 algorithm. (0) | 2021.02.12 |
댓글