[Android] ART 의 GC 이야기 |
https://source.android.com/devices/tech/dalvik/gc-debug
위의 사이트에 가면 여러가지 다른 이야기들도 많지만, 내가 필요한 개념들만(memory defragmentation 관련) 적당히 알면 되었기 때문에 그 내용들만 정리하였습니다. 더 심도있게 공부하고 싶으신 분들은 위 사이트를 직접 방문하시길~
ART GC overview
-
ART 는 Android 4.4 에 등장했고, Android 5.0 (LOS) 부터는 기본 runtime 이 되었다.
Dalvik runtime 은 더 이상 유지보수되지 않고 이용할 수도 없다. Byte-code format 은 그대로 ART 에서 사용된다.
-
ART 의 기본 GC plan 은 CMS ( Concurrent Mark Sweep ) 이다.
Sticky CMS 와 Partial CMS 가 있다.
Sticky CMS 는 메모리 이동이 없는 generational GC 이다. 그리고 마지막 GC 로부터 modify 된 녀석들만 scan 하고 메모리를 회수한다.
-
ART 에서는 GC 가 heap compaction 도 수행한다. 즉 heap memory defragment 를 해결한다.
-
ART 는 bitmap-based memory allocator 인 RosAlloc 를 도입했다.
이 allocator 는 shared locking 과 thread local buffer 를 추가해서 작은 할당을 하는 DIMalloc 을 사용한다.
-
Dalvik 과 비교하여 ART CMS GC 는 다음과 같은 개선이 있었다.
Pause 수가 반으로 줄었다. Dalvik 의 root marking 용 pause 가 ART 에서는 concurrent 로 된다.
Dalvik 과 비슷하게 ART GC 역시 sweeping 단계에서 pause 가 있다. 차이는 이 sweep 단계의 일부가 ART 에서는 concurrent 로 이루어진다는 것.
Sticky CMS 를 통해 GC 처리량이 훨씬 좋아졌다.
-
Dalvik 과 비교하여 주요하게 변경된 점은 ART GC 에서는 moving GC 를 도입했다.
moving GC 는 heap compaction 을 사용해서 bg app 의 메모리 사용을 줄이는 것이다.
이 event 를 trigger 하는 것은 ActivityManager 의 process-state 변화이다.
app 이 bg 로 내려가면 ART 가 이 GC 를 발동한다
Semi-space compaction 은 두 bump pointer space간 object 를 옮기는 것이다. 이 moving GC 는 low-memory device 에서 발생하며, 이는 Homogenous compaction 에 비해 약간 더 메모리 절약 효과가 있다. 그러나 app 이 foreground 로 올라올 때 CMS 가 bump pointer space 에서 메모리 회수를 할 수 없기 때문에 또 다른 transition 이 필요하다. ( 잘 모르겠다.. )
Homogenous space compaction 은 한 RosAlloc 공간에서 다른 RosAlloc space 로 옮긴다. 이는 heap fragmentation 을 줄인다. 그리고 이것이 기본 non-low-memory 단말에서의 compaction mode 이다. 주된 장점은 semi-space compaction 에 비해 app 이 foreground 로 전환될 때 heap transition 을 또 하지 않아도 된다는 것이다.
Performance
-
Dalvik 과 비교하여 ART 는 다음과 같은 개선이 있었다.
가장 큰 개선 중 하나는 ART 는 alloc 할 때 GC 를 하지 않는다. 그리고 나중에 GC 를 돌린다. 이것은 빠르지만 단점이 있다. 기존보다 더 많은 memory 를 사용한다는 것을 의미한다.
다행히도 ART 는 background process state 때 heap compaction 이 있어 defragment 를 한다는 점이다.
-
보통 Generational sticky CMS 가 partial CMS 보다 더 자주 도는 것이 이상적이다.
sticky CMS 는 footprint 를 바꾸지 않지만, partial CMS 는 heap 을 늘린다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] Staged Rollout? (0) | 2018.10.12 |
---|---|
[Android] ART vs. Dalvik (0) | 2018.10.11 |
Overview of Android Memory Management ( 안드로이드의 메모리 관리 ) (0) | 2018.10.09 |
[android] Background Optimization ( 백그라운드 최적화 ) (0) | 2018.10.08 |
[android] Gradle Tutorial #2 (0) | 2018.10.05 |
댓글