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

[Android] ART 의 GC 이야기

by 돼지왕 왕돼지 2018. 10. 10.
반응형

[Android] ART 의 GC 이야기



https://source.android.com/devices/tech/dalvik/gc-debug


위의 사이트에 가면 여러가지 다른 이야기들도 많지만, 내가 필요한 개념들만(memory defragmentation 관련) 적당히 알면 되었기 때문에 그 내용들만 정리하였습니다. 더 심도있게 공부하고 싶으신 분들은 위 사이트를 직접 방문하시길~

activitymanager, android art gc, art alloc gc, art gc, art gc performance, art memory 사용량 증가, art runtime, background process state, bitmap-based memory allocator, byte code format, CMS, concurrent mark sweep, dalvik gc vs art gc, dalvik runtime, davlik vs art, DIMalloc, generational GC, heap compaction, heap fragmentation, heap memory defragment, heap transition, Homogenous space compaction, low-memory device, memory defragment, moving GC, partial cms, process-state 변화, RosAlloc, Semi-space compaction, sticky cms, [Android] ART 의 GC 이야기


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 을 늘린다.




반응형

댓글