본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] ART 의 JIT (Just-In-Time) Compiler 에 대해 알아보자

by 돼지왕 왕돼지 2020. 7. 27.
반응형


android

https://source.android.com/devices/tech/dalvik/jit-compiler


-

Android runtime (ART) 는 Just-in-time (JIT) compiler 를 사용하여 안드로이드 앱이 동작할 때 지속적으로 빨라질 수 있게 프로파일링 하고 개선한다. (돼왕: NOS 부터 둘을 같이 사용)

JIT compiler 는 ART 의 현재 ahead-of-time (AOT) compiler 를 보조하여, 실행 성능을 개선하고, 저장 공간을 줄이며, system update 를 빠르게 한다. (돼왕 : 최초 설치시에는 dex2oat 로 compile 하지 않고, 자주 사용하는 앱들에 대해 추후 compile 을 진행하는 방식)

이는 앱 자동 업데이트나 OTA 를 통한 업데이트 시 재컴파일 등으로 인해 시스템이 느려지는 현상도 개선한다.



-

JIT 와 AOT 는 동일한 compiler 와 비슷한 set 의 최적화 기술을 사용하지만, 만들어내는 코드는 동일하지 않다.

JIT 는 runtime 의 정보를 반영하여 더 나은 inline 을 하고, on stack replacement(OSR, 동일한 기능 하는 더 성능 좋은 코드 변조) 컴파일이 가능하다.




JIT architecture


...




JIT compilation


-

앱이 실행될 때 ART 는 .dex file 을 load 한다.


만약 .oat file (.dex 의 AOT binary) 가 사용 가능하면, ART 는 그것을 바로 사용한다.

일반적으로 .oat file 이 보통 만들어지긴 하지만, 이것이 항상 AOT binary 를 포함하고 있는 것은 아니다.


만약 .oat 파일이 AOT binary 를 포함하지 않고 있다면, ART 는 JIT 와 interpreter 를 통해 .dex file 을 실행한다.



-

JIT 는 "speed" 컴파일 필터가 걸려있지 않은 한 enable 되어 있다.



-

JIT profile data 는 system directory 에 dump 되고, 그 앱만 접근할 수 있다.



-

AOT compilation (dex2oat) 데몬은 profile data 를 분석해서 재컴파일을 유도한다.



JIT workflow


-

Profiling 정보는 code cache 에 저장되고, memory 부족시 gc 되기 쉽다.

그리고 모든 것이 recording 되는 것도 아니다.



-

method 는 다음 3가지 상태에 놓일 수 있다.

    interpreted (dex code)

    JIT compiled

    AOT compiled


만약 JIT 와 AOT 코드 둘 다 있다면 JITed code 가 우선시된다.



-

JIT 을 위해 필요시되는 메모리는 앱마다 다른데, large app 일 수록 더 소비한다.




JIT log 켜기


-

$ adb root

$ adb shell stop

$ adb shell setprop dalvik.vm.extra-opts -verbose:jit

$ adb shell start




JIT 끄기


-

$ adb root

$ adb shell stop

$ adb shell setprop dalvik.vm.usejit false

$ adb shell start




compile 강제하기


-

$ adb shell cmd package compile


$ adb shell cmd package compile -m speed-profile -f my-package # profile-based, my-package 대신 -a 을 주면 전체에 대해..

$ adb shell cmd package compile -m speed -f my-package # full




profile data clear


-

$ adb shell cmd package compile --reset my-package # my-pakcage 대신 -a 주면 전체에 대해...



-

끝!!!




반응형

댓글