JVM
- Java Virtual Machine
- Java 바이트 코드가 실행될 수 있는 가상환경 플랫폼이다.
- a.Java 코드를 Java 컴파일러가 컴파일 → a.class a.class 파일은 플랫폼에 독립적이며 JVM 위에서 실행한다.
- 스택 기반의 가상머신
DVM
- Dalvik Virtual Machine
- 앱을 만들때 사용하는 a.class, b.class, c.class를 DEX 컴파일러가 하나의 a.dex 파일로 만들어 DVM 위에서 실행 가능하게 만든다.
- .dex 파일은 앱에 사용되는 Resource와 합쳐져서 하나의 APK 파일을 생성한다.
안드로이드에서 JVM → DVM 변화 이유
- JVM 은 스택 기반의 가상머신이고 DVM은 레지스터 기반의 가상머신이므로 더 적은 메모리 사용량으로 실행이 가능하다.
- JVM은 단일 인스턴스라 여러 애플리케이션에서 자원을 공유하여 사용하지만 DVM은 다중 인스턴스로 설계되어 애플리케이션 자체적인 VM 인스턴스가 제공 가능하다.
Android 버전 별 VM 변화
Android 5.0 이하
- DVM의 JIT 컴파일러 방식 사용(초기 JIT)
- APK 설치 후 실행할 때 JIT 컴파일러가 .dex 파일을 기계어로 변환 동적으로 한 줄씩 읽어가며 기계어로 변환 후 실행
- 장점
- 초기 앱 설치 시 빠름
- 저장 공간을 비교적 적게 사용
- 단점
- 앱 실행 시 기계어 코드로 변환 후 사용하므로 실행 속도가 느림
Android 5.0 ~ 6.x
- ART의 AOT 컴파일러 방식 사용
- APK 설치 시 .dex 파일을 .oat(기계어 전환 파일)로 전환 실행 시 .oax를 사용
- 장점
- 앱 실행 시 기계어로 변환이 되어 있으므로 실행 속도가 빠름
- 단점
- 기계어로 미리 전환하므로 많은 저장공간 사용
- 앱 설치 시 속도가 느림
Android 7.0 ~ 10.0
- ART에서 AOT 컴파일러와 JIT 컴파일러를 동시에 사용한다.
- 앱 설치 시 .dex 파일로 설치 및 앱 실행 시 기계어 변환
- 프로파일을 분석하여 주로 사용하는 코드를 .oat로 변환 해놓고 사용
- JIT와 AOT의 장점을 합친 방식
Android 10.0 ~
- PGC 방식 강화(AOT + JIT)