본문
170328(화) - ART & Dalvik
ART & Dalvik
ART & Dalvik
- managed runtime used by applications and some system services on Android.
- AOT (Ahead-of-time) compilation
ㆍtighter install-time verification than Dalvik.
ㆍinstall time에 ART는 dex2oat tool을 사용하여 컴파일
dex2oat : accepts DEX files as input and generates a compiled app executable for the target device.
- Improved garbage collection
ㆍGC는 앱의 퍼포먼스를 떨어뜨릴 수 있다.
ㆍART는 GC를 개선
1. 두개의 GC가 실행되려고 하면, 하나의 GC pause.
2. 남아있는 GC 일시정지중에 병렬로 processing 처리
3. 최근 allocated 된 short-lived 객체 정리를 위해서 특수한 Collector를 사용하여 lower total GC time을 단축
4. GC를 개선하는 동시에 nomaly GC도 만드는 경우가 발생하므로 GC_FOR_ALLOC 이벤트가 극히 드물게 발생.
5. compacting GC는 백그라운드 메모리 사용과 파괴를 줄인다.
- Debugging
ㆍSupport for sampling profiler
- developers have used the Traceview.
- Dalvik의 성능은 per-method-call overhead에 의해 왜곡되며, Traceview 사용은 런타임 성능에 영향을 미침.
- ART는 제한없는 sampling profiler를 지원
ㆍ속도 저하 없이 앱 실행을 정확히 관찰 가능
ㆍKitkat 릴리스의 Dalvik용 Traceview에 추가
ㆍSupport for more debugging features
- 새로운 디버깅 옵션을 제공
- 특히 모니터 및 GC 수집 기능이 포함
ㆍstack trace의 잠금을 확인하고 thread의 잠금이 있는곳으로 점핑
ㆍ클래스에 몇개의 instance가 있는지, reference가 무엇인지 확인
ㆍ특별한 instance를 위해서 event를 filtering
ㆍ메소드의 리턴 값 확인
ㆍ특정 field가 엑세스 및 수정될 때, 프로그램을 일시정지 하기위해 field watchpoint 설정
ㆍImproved diagnostic(진단) detail in exceptions and crash reports
ClassCastException
ClassNotFoundException
NullPointException
ArrayIndexOutOfBoundsException
ArrayStoreException
java.lang.NullPointerException: Attempt to write to field 'int android.accessibilityservice.AccessibilityServiceInfo.flags' on a null object reference
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
ART 에서의 앱 동작
- GC 문제 해결
ㆍDalvik에서 GC를 위해서는 System.gc() 명시적 호출 -> ART에서는 불필요
ㆍ런타임 사용 확인 : System.getProperty("java.vm.version") 호출
ART가 사용중이면 속성값은 "2.0.0" 이상
ㆍ현재 메모리 관리 개선을 위한 간결한 GC(compacting GC)가 AOSP에서 개발 중.
- JNI 문제 예방
ㆍART JNI는 Dalvik보다 엄격
ㆍ디버깅을 위해서 CheckJNI로 Android JNI 디버깅 가능
ㆍcompacting GC가 사용중일때만 메모리에서 객체를 이동 가능
- Stack 크기 문제 예방
ㆍDalvik에서는 native 코드와 Java 코드에 별도 스택 사용
ㆍ기본 Java 스택 크기 : 32KB
기본 native 스택 크기 : 1MB
ㆍART는 통합 스택이 존재
ㆍART Thread 스택 크기는 거의 Dalvik과 동일해야 한다.
- AOT 컴파일 문제 해결
ㆍAOT (Ahead-Of-Time) Java 컴파일
ㆍART는 설치시에 Dalvik보다 더 엄격한 바이트코드 검사를 수행
JIT vs AOT
- 안드로이드 2.2 프로요 버전 이전의 Dalvik
ㆍ앱이 구동되는 와중에 실시간으로 자바 코드를 CPU에 맞게 변환
- 안드로이드 2.2 프로요 버전 이후의 Dalvik
ㆍJIT 컴파일러가 추가되어 앱 최초 실행시에 자바 코드가 일정 부분 한꺼번에 변환이 된다.
ㆍ변환된 내용을 램 상에 올려 놓고 작업하게 된다.
- 안드로이드 5.0 롤리팝 버전 이후의 ART
ㆍAOT 컴파일러가 기본으로 적용되어 프로그램 최초 실행시가 아닌, 그 이전에(주로 설치시에) 한번에 전체를 변환해 두고 저장한 뒤, 프로그램 실행시 마다 변환된 코드를 읽어들인다.
ㆍ안드로이드 누가 이후의 ART VM에서는, JIT와 AOT를 모두 탑재함으로써 최초 설치시에는 무조건 JIT를 사용하도록 하여 설치시간과 용량을 적게 소모하도록 한 뒤, 차후 상황에 따라 각 방식을 유연하게 적용하도록 하였다.
1. 최초 설치 시 JIT 사용
2. 기기 사용이 멈추었거나, 차징중일 경우 컴파일을 조금씩 실행
3. 자주 사용하는 앱을 AOT로 변경
JIT(Just-In-Time) 문제
- 앱 최초 실행시에 자바 코드가 일정 부분 한꺼번에 변환되고, 이를 RAM상에 올려놓고 작업
- 성능은 향상되었지만 배터리 소모 문제 발생
- Dalvik은 실행 직전에 실행 부분 전체를 RAM에 올려놔야 함으로, RAM을 과도하게 점유
- 이러한 이유로 ART 개발
AOT 문제
- 앱 설치시 공간을 1.5 ~ 2배 가량 더 많이 차지
- 설치 속도가 Dalvik보다 느림
- KitKat 이하 버전의 Dalvik과 ART의 호환성 문제
- Nougat이후 JIT과 AOT 혼합 방식으로 설치속도 매우 개선
ART vs Dalvik
- Dalvik
ㆍDEX파일을 Dalvik 위에 올려두고 필요에 따라 실시간으로 컴파일
- ART
ㆍ기존 DEX파일을 dex2oat 변환기를 이용하여 OAT파일에 저장해두었다가 실행
ㆍOAT파일은 가상머신을 거치지 않고 바로실행
'Mobile > Android API' 카테고리의 다른 글
170411(화) - System permission (0) | 2017.04.11 |
---|---|
170411(화) - Device Compatibility (0) | 2017.04.11 |
170328(화) - App 기본 항목 (0) | 2017.03.28 |
170328(화) - DEX (Dalvik Executable format) (0) | 2017.03.28 |
170321(화) - Android 구조 (0) | 2017.03.21 |
댓글