달빅 가상 머신(Dalvik virtual machine)

달빅 가상머신은 안드로이드 애플리케이션을 실행할 수 있는 가상 머신이다. 안드로이드 플랫폼 4.4.4 이전 버전에 들어간다. 안드로이드 스마트폰 초창기에는 베터리나 램 제약 등 현재에 비해 많이 열악하기 때문에 달빅 가상 머신은 적은 메모리 요구 사양에 최적화되어 있다. 그래서 전체 앱을 실행하기 전에 기계어로 컴파일 하는 대신 Just In Time 컴파일, 줄여서 JIT라는 전략을 사용했다. 달빅은 필요한 코드만 컴파일하고 런타임에 수행하기 때문에 많은 RAM을 절약할 수 있었다.

 

Dalvk - Just In Time 컴파일러

 

JVM은 단일 인스턴스로 여러 애플리케이션에서 공유되어 사용되지만 DVM은 다중 인스턴스로 실행되도록 설계되어 있어서 좀 더 효율적인 운영이 가능하다. Dex 컴파일러는 class 파일을 dex 파일로 변경되며 최종적으로 dex, 리소스를 포함한 기타 라이브러리 등이 압축되어 APK(Android application package)가 완성된다. 안드로이드 SDK에 함께 들어 있는 dx라고 이름 붙은 도구를 이용하면 자바 클래스 파일들을 .dex 포맷으로 바꿀 수 있다.

 

달빅이 나오게 된 배경

빠르다

DVM은 레지스터 기반 모델을 사용한다. JVM 스택 기반 모델은 많은 메모리를 요구하지만 레지스터 기반 모델은 적은 메모리를 요구하기 때문에 상대적으로 더 빠르다.

 

라이선스

구글에서 오픈소스로 제공될 안드로이드에서 JVM을 사용할 경우 라이센스 관련한 문제가 발생할 수 있기 때문에 JVM을 사용하는 것은 적합하지 않았다.

 

 

Android Rumtime(ART)

도입 배경

달빅의 JIT는 심각한 단점이 있었는데 모든 것이 런타임에 발생하기 때문에 런타임 성능에 부정적인 영향을 미쳤다. 성능을 향상시키기 위해 자주 사용되는 컴파일된 코드 조각 중 일부를 캐싱하여 다시 컴파일하지 않도록 했다. 이는 몇년동안 잘 작동했지만 스마트폰은 점점 더 성능이 향상되어 RAM 용량도 향상되었고 앱 또한 점점 더 커지고 있어서 JIT 성능에 미치는 영향이 더 큰 문제가 되었다. 그래서 새로운 Android 런타임인 ART가 도입되었다.

 

ART - Ahead Of Time 컴파일러

 

Ahead of Time 컴파일

ART는 JIT 컴파일을 사용하는 대신 Ahead of Time 컴파일이라는 전략을 사용했다. ART는 런타임 시 코드를 해석하는 대신 앱을 싱행하기 전에 코드를 컴파일 하고 앱이 실행 중일 때 이미 기계어 코드를 준비했다. 이 접근 방식은 기존 방식보다 런타임 성능이 20배 더 빠르다

 

AOT 장점

  • 배터리 성능 : ART는 dex 바이트 코드가 매번 해석되지 않기 때문에 DVM에 비해 배터리 성능을 크게 향상시킨다
  • 응용 프로그램 시작 시간 : DVM은 응용 프로그램의 시작 시간이 더 느립니다. ART는 AOT 덕분에 네이티브 코드를 실행할 수 있어서 매우 빠르다
  • 가비지 컬렉션 : ART는 DVM보다 가비지 컬렉션이 훨씬 뛰어나다. DVM에서 힙은 더 세분화되지만 반면 ART는 비트맵과 같은 큰 개체를 저장하기 위해 다른 힙을 사용한다. 또한 ART는 동시 압축 Garbage 수집기를 가지고 있으며 DVM에 비해 쉽게 힙을 압축할 수 있다.

AOT 단점

  • 높은 RAM 사용량
  • APK 다운로드 후 전체 앱을 기계어로 변환해야 하기 때문에 앱 설치 시간이 오래 걸리고 모든 앱을 다시 최적화해야 하기 때문에 시스템 업데이트를 수행하는 데 시간이 더 오래 걸린다.

 

 

Dalvik과 ART 비교

 

 

프로필 기반 컴파일(Android N) - JIT + AOT

 

앱을 자주 실행되는 부분의 경우에는 미리 컴파일하는 것이 도움되지만 앱이 대부분이 사용자로부터 열리는 경우는 매우 드물고 이에 따라 미리 컴파일하는 것은 거의 도움이 되지 않는다. 따라서 프로필 기반 컴파일이 도입되었다. 프로필 기반 컴파일은 기본적으로 JIT 컴파일 전략을 사용하여 컴파일되지만, 일부 메서드가 자주 사용된다는 것을 감지하면 ART가 이러한 메서드를 미리 컴파일하고 캐시하여 최상의 성능을 얻을 수 있다.

 

 

 

참고

https://www.charlezz.com/?p=42686

https://www.journaldev.com/23464/android-runtime-dvm-vs-art-aot-vs-jit

https://proandroiddev.com/android-runtime-how-dalvik-and-art-work-6e57cf1c50e5

 

복사했습니다!