Android

Android 04. 안드로이드의 가상머신은?

shin96bc 2022. 5. 19. 14:20

JAVA의 가상머신은 JVM 이다.


(1) JVM( Java Virtual Machine )

     1) JVM은 자바 바이트코드를 실행할 수 있는 주체이다. 

     2) 자바 바이트 코드는 플랫폼에 독립적이며, JVM에 의존적으로 실행된다.

     3) 한마디로 플랫폼에 맞춰 소스코드를 빌드 할 필요없이, 한번의 빌드로 여러 플랫폼에서 실행할 수 있다.

        (즉, Windows, Mac, Linux 어느 플랫폼에서도 JVM만 동작한다면 새로 컴파일 할 필요없이 실행가능)

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

     4) JVM의 특성

          <1> 스택 기반의 가상머신이다.

          <2> 단일 상속형태의 객체지향 프로그래밍을 가상머신 수준에서 구현했다.

          <3> 포인터를 지원하지만, C언어와 같이 주소값을 임의로 조작하는 포인터 연산은 불가능하다.

          <4> 가비지 컬렉션을 사용한다.

          <5> 모든 기본타입의 정의를 명확히 함으로써 플랫폼 독립성을 보장한다.

          <6> 데이터 흐름 분석에 기반한 자바 바이트코드 검증기를 통해 스택 오버플로우, 명령어 피연산자의

                 타입 규칙을 어기거나, 지역변수를 초기화 전에 사용하거나, 필드 접근 규칙을 위반하거나 하는

                 문제들을 실행전에 검증하여(컴파일 시점에서 검증) 실행 시 안전을 보장하고 별도의 부담을

                 줄여준다.


그렇다면 Android의 가상머신은 무엇일까?

Android의 가상머신은 크게 두가지라고 할 수 있다.


(1) DVM( Dalvik Virtual Machine )

     1) DVM은 안드로이드 애플리케이션을 실행할 수 있는 가상 머신이다.

     2) 모바일 기기 특성상 베터리 수명, 컴퓨팅 파워 및 메모리가 데스크탑 환경에 비해 열악하다.

         그렇기 때문에 모바일 기기 환경에 맞게 최적화되어 나온 가상 머신이 바로 DVM 이다.

 

출처:&nbsp;https://www.charlezz.com/?p=42686

     3) 위의 이미지는 APK가 만들어지는 과정을 보여주고 있다.

     4) 자바 바이트코드로 변환되는 과정은 JVM과 동일하지만, 마지막 두단계가 다르다.

     5) Dex 컴파일러는 class파일을 dex파일로 변경하여 DVM에서 실행가능하게 만든다.

         여러개의 class파일이 하나의 dex파일로 변경되며, 최종적으로는 dex, 리소스를 포함한 

         기타 라이브러리 등이 압축되어 APK( Android Application Package )가 완성된다.

     6) JVM은 단일 인스턴스로 여러 애플리케이션에서 공유되어 사용하지만,

        DVM은 다중 인스턴스로 실행되도록 설계되었기 때문에 좀 더 효율적으로 운영되고,

        애플리케이션에 자체적인 VM인스턴스가 제공된다.

      7) DVM을 사용하는 이유

           <1> 빠르다

                1> 안드로이드에서 DVM을 사용하는 가장 큰 이유 중에 하나는 JVM이 사용한

                    스택 기반 모델 대신, 레지스터 기반 모델을 사용한다는 점이다.

                2> 스택 기반 모델은 많은 메모리를 요구하며 안드로이드에서는 빠른 성능을 

                    낼 수 없다.

                3> 그러나 레지스터 기반 모델은 적은 메모리 사용을 요구하기 떄문에

                    빠르게 동작이 가능하다.

                4> 그래서 안드로이드에서는 레지스터 기반 모델을 사용하는 DVM을 사용하는 것이다.

                    

           <2> 라이센스 문제

                1> 구글에서는 오픈소스로 제공될 안드로이드에서 JVM을 사용할 경우에 발생할 수 있는

                     라이센스와 관련된 문제를 피하기 위해 새로운 가상머신이 필요했다.

                2> JVM은 기본 무료지만, GPL라이센스이며 안드로이드와 관련된 내용들은

                    Apache 라이센스가 대다수였기 때문에 JVM을 사용하는 것은 적합하지 않았다.

                    (하지만 일부 자바 API 사용에 대해 오라클에 고소를 당했고, 결국 패소했다. 

                     그래서 구글은 Kotlin 을 안드로이드 공식 언어로 채택하기도 했다.)

 

(2) ART( Android Runtime )

     1) ART 는 안드로이드 애플리케이션 런타임 환경으로 새로운 디버깅 기능과 좀 더 정확한 고수준의

        애플리케이션 프로파일링 기능을 제공한다.

     2) 구글이 DVM에서 ART로 변경한 진짜 이유는 바로 압도적인 퍼포먼스 개선이다.

     3) 내부적으로 이를 이해하려면 우선 컴파일 언어인터프리터 언어의 차이를 알아야한다.

     4) 컴파일러( Compiler ) 와 인터프리터( Interpreter )

 

출처:&nbsp;https://www.charlezz.com/?p=42686

          <1> 컴파일러 언어와 인터프리터 언어의 가장 큰 차이점은 컴파일을 수행하는 시점이다.

                 런타임 전에 컴파일을 수행하면 컴파일러 언어이고, 

                 런타임에 컴파일을 수행하면 인터프리터 언어이다.

          <2> 컴파일러 언어는 미리 컴파일을 해두기 때문에 실행속도가 빠르다는 이점을 얻는 대신,

                 플랫폼 종속성과 디스크 공간 활용이 단점이다.

                 (대표적으로 C, C++, C# 등이 컴파일러 언어에 속한다.)

          <3> 인터프리터 언어는 런타임 중에 한줄 한줄 해석하며 실행하기 때문에 상대적으로 

                 컴파일러 언어보다 느리지만 코드 변경시 즉시 실행이 가능하다는 장점이 있다.

                 (대표적으로 JavaScript, HTML, Python, SQL, Ruby 등이 있다.)

          <4> Java의 경우 javac(컴파일러)를 통해 컴파일을 하게 되고, 그 결과로 바이트 코드를 얻기

                때문에 컴파일러 언어지만, VM(가상머신)에서 바이트 코드를 다시 기계어로 변환한다는

                점에서 인터프리터 언어의 특징도 가지고 있다.

 

(3) DVM 과 ART 의 컴파일러 ( JIT vs AOT )

     1) JIT( Just In Time )

          <1> JIT 는 Android 2.2 버전( Froyo )부터 적용된 DVM 내부의 컴파일러 이다.

          <2> 바이트 코드를 가상 머신에서 기계어로 번역한 결과를 캐쉬에 저장하기 때문에 

                 다시 해당 바이트 코드를 실행해야 하는 경우 캐쉬의 내용을 불러오기 때문에

                 퍼포먼스가 개선되었지만 별도의 메모리 캐시가 필요하다는 점에서 일반적인

                 인터프리터 방식보다는 더 많은 메모리 공간이 필요하다.

 

     2) AOT( Ahead of Time Compile )

          <1> AOT는 ART 내부의 컴파일러로써 DVM의 JIT와 달리 애플리케이션이 설치되는 

                 시점에 애플리케이션 전체 바이트 코드를 기계어로 번역한다.

          <2> 그렇기 때문에 설치시간이 오래걸린다는 단점이 있지만, 런타임에서 바이트 코드를

                 해석하는 시간을 제거했기 때문에 전체적인 퍼포먼스가 좋아졌고, 배터리 수명이

                 향상되게 된다.

출처:&nbsp;https://www.charlezz.com/?p=42686

 

 

참고자료:

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