팡세영
Log sey
팡세영
전체 방문자
오늘
어제
  • 분류 전체보기 (74)
    • PS (45)
      • programmers (13)
      • 백준 (29)
    • Android (16)
    • Daily (0)
    • Kotlin (6)
    • Design Pattern (2)
    • Java (1)
    • Flutter (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 정렬
  • CustomView
  • 이분탐색
  • Kotlin
  • 안드로이드
  • 코틀린
  • LEVEL2
  • 구현
  • compose
  • 완전탐색
  • 백준
  • 프로그래머스
  • TestCode
  • BFS
  • 의존성 주입
  • 자바
  • programmers
  • binding
  • 해쉬맵
  • 하단네비게이션바
  • java
  • mvvm
  • 골드
  • flutter
  • Android
  • programmers #프로그래머스
  • 실버
  • 문자열
  • DFS
  • ArcitecturePattern

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
팡세영

Log sey

안드로이드 컴파일 (JVM, DVM)
Android

안드로이드 컴파일 (JVM, DVM)

2022. 7. 4. 20:43

안드로이드는 초창기에 사용된 Dalvik 컴파일 방식과 그 이후에 도입된 ART 컴파일 방식 2가지로 나누어 진다.

 

안드로이드는 개발 언어가 Java로 채택되면서 JVM이 필요 했었는데,

라이센스 문제와 메모리 효율성등의 문제로 안드로이드는 Dalvik VM(=DVM)을 사용하게 됩니다.

 

그럼 그 라이센스 문제가 뭔데?

  • Java ME를 사용하기 위해서 Sun 회사에게 라이센스 비용을 지불해야하는 문제가 발생했다.
  • (DVM에서 컴파일 과정 중 .class를 .dex로 변환하는 dx 툴은 Java SE를 사용했기 때문에 Java 언어 사용은 문제되지 않았다.)

그럼 라이센스는 알겠는데.. 메모리 효율성은 뭐죠?

  • JVM은 스택 기반 모델로 많은 메모리를 요구하지만 DVM은 레지스터 기반 모델로 적은 메모리에 최적화 되어 있다.                    (JVM에 비해 명령이 단순하고 처리 속도가 빠르다)
  • 여러 개 VM 인스턴스를 실행할 수 있고, 프로세스 독립성, 메모리 관리 & 스레딩을 지원한다.

Java와 코틀린 언어가 컴파일 되는 과정

 1. 자바(.java)와 코틀린(.kt)으로 구성된 파일이 존재 

 2. 각각의 javac 와 kotlinc에 의해서 자바 바이트 코드로 컴파일 된다. 

 3. 이 자바 바이트 코드는 jvm의 jit컴파일러에 의해서 기계가 이해 할 수 있는  기계어로 변환된다. 

 4. 해독된 기계언어를 메모리에 할당 후 cpu에 의해 실행된다.

 

Jvm을 사용한 컴파일 방식과 달리 안드로이드에서는 DVM(Dalvik Virtual Machine) 과 ART(Android Run Time)를 사용한다.

 


안드로이드의 컴파일 방식

 

 

위의 DVM은 JIT(Just in time) 방식을 사용하지만 ART(Android Runtime)은 AOT(Ahead Of Time)을 사용한다.

 

  • JIT 방식은 앱 구동 중에 실시간으로 컴파일(기계어 번역)을 하기 때문에 설치 시 속도가 빠르지만 실행 시에 느리다는 단점이 있었다. 또한 번역한 정보를 메모리에 올려서 메모리 부하가 컸다.
  • AOT방식은 앱 인스톨과 함께 네이티브 코드로 컴파일 되어 설치되어, 실행중에 컴파일을 할 필요가 없게 만들어, 빠른 성능을 보인다.가비지컬렉션, 디버그등 개선 

 

JVM은 다양한 네이티브 언어를 지원하여 느리기 때문에 안드로이드에서는 JVM방식에서 DVM 방식으로 바꾼 것이다.

 

 

'Android' 카테고리의 다른 글

Android BottomNavigation Bar Round효과  (0) 2022.08.02
안드로이드 액티비티간 화면 전환 및 데이터 전달 (Intent) - Kotlin  (0) 2022.07.25
[Android ]Progress Bar - Kotlin  (0) 2022.07.25
[Kotlin] 코틀린에서의 변수 사용법  (2) 2022.07.07
코틀린으로 레이아웃 연결하기 (뷰 바인딩)  (0) 2022.07.04
    'Android' 카테고리의 다른 글
    • 안드로이드 액티비티간 화면 전환 및 데이터 전달 (Intent) - Kotlin
    • [Android ]Progress Bar - Kotlin
    • [Kotlin] 코틀린에서의 변수 사용법
    • 코틀린으로 레이아웃 연결하기 (뷰 바인딩)
    팡세영
    팡세영
    Android, CS, PS

    티스토리툴바