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 주면 전체에 대해...
-
끝!!!
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] RecyclerView 에서 Drag 와 Swipe 구현하기 (1) | 2020.07.29 |
---|---|
[Java] Generational Concurrent GC 에 대해 알아보자 (0) | 2020.07.28 |
[android] App 이 kill 되면 Alarm 이나 Job 은 어떻게 될끼? (0) | 2020.07.26 |
[android] Recent app 에서 swipe 로 app 을 죽이면 process kill 이 될까? (0) | 2020.07.25 |
[android] JobScheduler dumpsys log 분석해보자 (0) | 2020.07.24 |
댓글