Kotlin 소개
Kotlin은 JetBrains에서 개발한 언어로, 주로 JVM(Java Virtual Machine)에서 실행됩니다.
Kotlin은 Java와 100% 상호 운용성을 갖고 있어, 혼합하여 사용할 수 있습니다.
JVM이란 ?
JVM(Java Virtual Machine)은 Java 바이트 코드를 실행하기 위한 가상 머신입니다.
실제 하드웨어와 운영체제에 의존하지 않고, 한 번 작성된 코드가 다양한 플랫폼에서 실행될 수 있도록 합니다.
JVM은 Java 뿐만 아니라 Kotlin, Groovy 등 여러 언어의 실행 환경을 제공합니다.
JVM 구조
1. Class Loader
- JVM이 실행할 클래스 파일을 찾고, 런타임 데이터 영역에 배치하는 역할입니다.
- Bootstrap ClassLoder, Extension ClassLoder, Application ClassLoder와 같이 세 가지 클래스로 구성됩니다.
- Bytecode Verifier를 통해 바이트코드를 검증하여 클래스가 안전하게 실행될 수 있도록 도와줍니다
- 필요한 클래스를 로드하며, 클래스를 로드할 때 순서와 의존성 관리를 합니다.
2. Runtime Data Area
- JVM이 실행되는 동안 메모리에서 데이터를 저장하고 관리하는 영역입니다.
- Class Area : 클래스의 구조와 메서드의 바이트코드, 상수 풀 등이 저장되며, 모든 스레드가 공유하는 메모리 영역입니다.
- Heap : 객체 인스턴스들이 동적으로 할당되는 메모리 영역입니다. 가비지 컬렉션이 이 영역에서 불필요한 객체를 정리합니다.
- Stack : 각 스레드마다 독립적으로 존재하는 메모리 영역으로, 메서드 호출 시 각 스레드의 실행 상태를 저장합니다.
- PC Register : 각 스레드가 현재 실행 중인 JVM 명령어의 주소를 가리킵니다.
- Native Method Stack : JVM이 아닌 네이티브 코드(C/C++ 등)를 실행할 때 사용되는 메모리 영역입니다.
3. Excution Engine
- 로드된 클래스의 바이트코드를 실제로 실행하는 역할을 합니다.
- Interpreter, JIT, Garbege Collector으로 구성되어 있습니다.
4. Native Method Interface
- 네이티브 코드를 호출할 수 있는 기능을 제공합니다. JVM과 네이티브 코드 간 상호작용을 가능하게 해주는 인터페이스입니다.
- 이 기능을 통해 운영체제와 상호작용하거나, JVM이 제공하지 않는 기능을 구현할 수 있습니다.
5. Native Method Libraries
- JVM이 네이티브 메서드를 사용할 때 필요한 라이브러리입니다.
* JVM 동작 순서
1 : 클래스 파일(.class) 파일 로드(.class 파일은 2의 Class Area에 배치) -> 바이트코드가 올바른지 검증
↓
2 : 각 영역마다 객체나, 함수 등을 저장합니다.
↓
3 : Interpreter가 바이트코드를 한 줄씩 읽고 해석 -> JIT에 의해 자주 사용되는 바이트코드가 네이티브 기계어로 변환하여 캐시에 저장, 빠르게 실행 -> Garbege Collector를 통해 힙 메모리에서 참조되지 않는 객체 제거
* Kotlin 동작 순서
.kt -> Kotlin Complier -> .class -> JVM 동작 순서와 동일
- Kotlin Complier가 .kt 파일을 컴파일함-> Complier는 Kotlin코드를 바이트 코드로 변환하고, .class 파일로 생성하여 JVM이 이해할 수 있게 해주는 도구
운영체제(OS)와 JVM
- 운영체제는 컴퓨터와 하드웨어와 소프트웨어 간 중재자 역할을 합니다. CPU, 메모리, 네트워크 자원 등을 관리하며, 애플리케이션이 자원에 접근할 수 있도록 인터페이스를 제공합니다.
- JVM은 운영체제 위에서 실행되는 가상 머신입니다. 실제 하드웨어와 상호작용하지 않고, 운영 체제의 API를 통해 시스템 자원에 접근합니다.
- JVM은 다양한 운영체제에서 동일한 바이트코드로 실행할 수 있도록 설계되었습니다. 특정 운영체제에 종속되지 않으며, 동일한 바이트코드를 다양한 OS에서 실행할 수 있습니다.
- JVM은 운영체제에서 하나의 독립적인 프로세스로 실행됩니다. 운영체제는 JVM 프로세스에 메모리, CPU 시간 등을 할당하며, JVM은 이 자원을 사용하여 애플리케이션을 실행합니다.
JVM 메모리 관리
- JVM은 필요한 메모리 관리를 위해 2. Runtime Data Area을 사용합니다.
- JVM은 Heap 영역에서 객체를 동적으로 할당합니다. 운영체제는 JVM에 메모리를 할당하며, 이 메모리를 기반으로 런타임 데이터 영역을 구성합니다. (필요시 OS에 추가 메모리를 요청할 수 있음)
- JVM은 메모리를 효율적으로 관리하기 위해 Garbege Collector을 수행합니다. Garbege Collector는 힙 메모리를 주기적으로 스캔하여 더 이상 참조되지 않는 객체를 찾아 자동으로 메모리에서 해제합니다. 이를 통해 메모리 누수를 방지라고, 메모리 사용을 최적화할 수 있습니다.
참고 자료
https://blog.geekster.in/jvm-architecture/
What is JVM(Java Virtual Machine) Architecture?
JVM Architecture: Learn JVM role in executing programs, memory management, exception handling, and WORA concept. JVM Explained
blog.geekster.in
https://blog.jamesdbloom.com/JVMInternals.html
JVM Internals
Explains the internal architecture of the Java Virtual Machine (JVM) in simple terms using showing key components and how memory is updated during execution.
blog.jamesdbloom.com
'안드로이드' 카테고리의 다른 글
[안드로이드] Kotlin을 활용한 Clean Architecture(+ Hilt 활용한 간단한 예제) (3) | 2024.09.03 |
---|---|
[안드로이드] Coroutine은 무엇일까? (2) | 2024.08.28 |
[안드로이드] SharedPreferences 사용법 및 저장 (0) | 2024.08.27 |
[안드로이드] Android에서 Thread는 ?? (0) | 2024.08.26 |
[안드로이드] Intent와 Bundle은 무엇일까? (0) | 2024.08.25 |