이번 글은 JVM, DVM, ART에 대한 지식을 공유해보려 한다.
과거 안드로이드를 공부할 때 이론이나 운영체제 공부보단 프래임워크를 먼저 접해보고 기능 구현을 먼저 했던 터라 이론적인 내용이 너무 부족하였다.
때문에 공부하던 도중 마주한 JVM, Dalvik, ART가 뭔지 너무나 생소했다.
실행을 도와주는 녀석들인것같은데.. 조금 깊게 볼 필요가 있을 것 같아 이번 포스팅을 진행한다!
Java virtual Machine 가상머신

JVM은 자바 가상 머신으로, 자바 컴파일러를 통해 생성된 .class 파일(자바 바이트코드)을
JVM 내부에 있는 JIT(just in time) 컴파일러를 통해 기계어로 바꿔주는 역할을 담당한다.
즉, 자바 코드를 실행시켜주는 프로그램이고, JVM 덕분에 JAVA는 운영체제 종속성에서 매우 자유롭다.
여기에 JVM이 잘 정리되어 있다. -> 링크텍스트
중요한 것은,
JVM은 데탑, 노트북 등을 위해 나온 녀석이다.
JAVA언어를 선택한 Android에서 JVM을 동작시키기엔 너무 크고, 비효율적이며 저작권 문제도 존재하였다.
그래서 Google은 DVM 을 만들어냈다.
Dalvik Virtual Machine 가상머신

자바 바이트코드로 변환하는것 까지는 동일하지만, 그 이후 JVM을 통해 저급언어로 변환되는것이 아닌 여러 개의 자바 바이트코드 파일들이 dex 컴파일러를 거쳐 하나의 .dex 파일로 변경된다.
APK (Android Application Package) : .dex + 리소스가 포함된 기타 라이브러리
또한, 다양한 VM에서 쓰기 좋은 스택 기반 JVM 대신, Android OS에 최적화된 레지스터 기반 DVM을 만들서 쓰기 때문에 속도 등의 측면에서 효율적이다.
스택 기반 모델
- 계산 시 스택을 사용
- 대상 하드웨어(레지스터, CPU 기능 등)에 대해 직접적으로 다루지 않으므로 다양한 하드웨어에서 VM을 쉽게 사용
레지스터 기반 모델
- 계산 시 레지스터를 사용,
- 타겟팅된 OS 사용으로 명령어 최적화가 가능하다.
- 비교적 적은 메모리 사용을 요구하기 때문에 빠르게 동작한다.
그러나 이러한 DVM의 JIT 컴파일 방식에서도 한계점이 존재했다.
- JIT 방식은 앱 구동중에 실시간으로 컴파일을 시켜 기계어로 번역하기 때문에 앱 실행속도가 느리다는 단점이 존재.
- 번역한 데이터를 메모리에 올리기에 메모리 부하 큼.
Android Run Time
기계어로 해석된 앱을 실행시키기 위해 런타임 시 사용되는 라이브러리.
DVM의 JIT 컴파일 방식의 단점을 보완하기 위해 만들어졌음.
AOT(Ahead Of Time) 컴파일 방식을 사용함.
AOT 컴파일 방식
- 최초 앱 설치 시 컴파일 과정이 동반되어 최초 설치 속도가 느림
- 대신 앱 실행 시 필요한 컴파일 과정이 필요없기 때문에 CPU 사용량이 줄고 빠름 + 배터리 수명 향상
- 번역 정보를 파일에 저장하기 때문에 설치 용량이 이전 JIT방식보다 많아짐.
- 설치 시점에서 기계어로 번역하기 때문에 실행시 한줄한줄 컴파일 해 사용하는 인터프리터방식의 DVM이 필요없어짐.

(출처 : 링크텍스트)