1. Compiler vs Interpreter
Compiler 언어(대표적으로 C, C++ 등)
Runtime 전에 미리 하드웨어 플랫폼 별로 적합한 Machine Code로 해석해 두었다고, Runtime시 별도 처리 없이 실행
Interpreter 언어(대표적으로 Script 언어)
Runtime에 해석과 실행을 동시에 한다.
Compiler 언어는 빠른 실행 속도라는 이점을 얻는 대신, Machine Code의 플랫폼 종속성과 디스크 공간 활용이 단점이자 비용이 된다.
Interpreter 언어는 플랫폼 종속성은 없지만, Runtime시 빈번한 인터프리팅이 일어나기 떄문에 상대적으로 실행 속도는 느린 편이며, 스크립트 언어들이 여기에 속한다.
Java는 Runtime 전에 바이트 코드로 컴파일하는 부분(Compiler 언어 특성), 바이트 코드가 플랫폼 종속성이 없다는 점과 Runtime시 Virtual Matchine이 실행되는 동안 결국 Machine Code로의 해석이 필요하는 점(Interpreter 언어 특성) 두 가지를 가진다.
2. JIT(Just In Time) Compiler
자바 환경에서 VM과 JIT Compiler의 역할
JIT Compiler는 Runtime시 특정 횟수 이상 반복 해석되는 바이트 코드들에 대해 추가로 Machine Code로 컴파일하여 캐싱하고, 이를 통해 불필요한 바이트코드 해석을 배제하여 Runtime시 실행 속도를 향샹시키는 방식이다.(Java는 JDK 1.3 시점 이후) 컴파일과 실행이 동시에 일어나는 경우가 다수인 초반에는 다소 느릴 수 있으나, 이후의 실행 속도가 상당 부분 개선되었다.(Android Froyo 버전이후 Davlik VM에도 적용)
JIT 한계
JIT에 의한 바이트코드 해석 동작이 일어나는 시점은 주로 앱 실행할 땡롸 화면 전환할 때인데, 앱 실행과 화면 전환은 매우 빈번하게 일어나는 동작이었기 때무에 배터리 소머가 많이 발생하였고, UI의 부드러움 또한 기대하기 어려웠으며 Machine Code 캐싱으로 인한 램 점유율도 다소 높은 편이었다.
3. AOT(Ahead-Of-Time) Compiler
기존 Dalvik VM처럼 바이트코드 컴파일은 동일하게 진행하나 모든 바이트 코드를 앱 설치 시점에 Machine Code로 해석한다. 따라서 화면 전환시 부자연스러웠던 부분과 배터리 소모 부분에 대해서 개선되었다.
참고: ART에서는 Garbage Colletion과 관련하여 Moving Collector(Compacting GC)를 적용하였다. Collector가 Heap 공간의 Object Allocation에 의해 빈번하게 생기는 Fragmentation를 제거함으로써 메모리 공간의 효율성을 높이고, 좀 더 빠른 Allocation이 가능해지면서 OOM 같은 예외의 빈도도 줄일 수 있게 개선되었다.
4. Dalvik VM vs ART VM
Dalvik VM
JIT 방식으로 되어 있으며 자바 바이트 코드(.class)를 달빅 바이트 코드(.dex)로 변환해 두고, 이를 런타임에 JIT 컴파일하며 실행하는 방식.
장점은 여러 .class 파일에 있는 중복된 코드를 재사용하기 때문에 용량을 절약할 수 있다. 단점은 배터리 소모가 크고 CPU, 메모리 사용이 높다.
ART VM
AOT와 JIT 방식(Nougat 버전 부터 둘 다 탑재, 그 전에는 AOT만 탑재)으로 되어 있으며 .dex 파일을 .oat 파일로 컴파일하므로 중간 언어가 Davlik 바이트 코드가 된다. GC를 향상시켰다.
장점으로 상대적으로 속도 개선이 되고 배터리 효율성도 높였ㄷ으나 단점으로 앱 설치시 공간을 1.5배에서 2배 가량 많이 차지하게 되고, 설치 속도가 Dalvik VM보다 느리다는 것이다.
ART는 설치 시에 Dalvik보다 더 엄격한 바이트코드 검사를 수행한다.
Reference
ART(Android 런타임)에서 앱 동작 확인 | Android Developers
안드로이드 플랫폼의 구조 / ART :: UMBUM
Android Runtime Improvements – MindOrks – Medium
안드로이드 런타임 - 나무위키
Java 플랫폼의 성능 개선 이야기– Android ART : 네이버 블로그
[Android] Dalvik , ART 란 ?
오타수정 thanks by 성진님 캄사합니다
'Programming > Android' 카테고리의 다른 글
[Android] Context (0) | 2018.09.18 |
---|---|
[Android] 앱 구성 요소(Application Component) (2) | 2018.09.15 |
[Android] How To APK Install Programmatically (0) | 2018.09.05 |
[Android] Input Event (0) | 2018.06.16 |
[Android] View (0) | 2018.06.14 |