안드로이드

[안드로이드] Kotlin과 JVM(Java Virtual Machine)

권송미 2024. 8. 29. 20:32
728x90
반응형

 

 

 

 

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

 

728x90
반응형