안드로이드 가비지컬렉터와 컴파일러#
가상머신 히스토리#
우선 안드로이드 가비지 컬렉터 히스토리에 대해 알아보자.
안드로이드의 시작은 오픈소스 플랫폼이었고 2005년 구글에 인수되었다.
그리고 안드로이드는 자바로 만들어졌고 JVM 환경에서 돌아가기 때문에 구글은 라이센스 문제로 오랫동안 오라클과의 분쟁을 이어왔다.
JVM의 라이센스, 성능 문제 등 이러한 이유들로 인해 구글은 자체적으로 가상머신을 만들었고 그것이 Dalvik 이다.
Dalvik 은 기본적으로 jvm과 유사하며 dex컴파일러로 번역되어 실행된다.(아마 몇년 전까지만 해도 다들 multidex를 한 번쯤 경험했을 것이다.)
이후 JIT 컴파일러가 추가되어 성능이 보완되었고 Android 5.0 부터는 AOT 컴파일러가 적용된 ART VM으로 변경되었다.
먼저 가비지 컬렉터를 알아보기 전에 컴파일러에 대해 알아야 한다.
JIT | AOT | |
---|---|---|
실행 | dex, odex | oat |
GC | cms 알고리즘 | customized cms 알고리즘 |
실행 속도 | 느리다(함수가 콜될때 번역하기 때문에) | 빠르다(미리 바이너리로 번역되어 있기 때문에) |
빌드 용량 | 작다 | 크다 |
보통 Dalvik = JIT, ART = AOT 가상머신과 컴파일러는 한 쌍과도 같지만 각자의 장단점으로 인해
Android 7.0 부터는 AOT와 JIT를 모두 활용하고 있다.
ART#
ART 의 가비지컬렉터는 Mark and Sweep 방식이며 사용되지 않는 객체를 걸러내고 파편화 된 메모리를 정리 및 압축한다.
여기서 효율적으로 관리하기 위해 새로운(Young) 영역과 Old 영역으로 나눠서 관리하며 마치 c#의 점진적 방식(세대별 구분)과 유사하다.
Young#
- 새롭게 생성된 객체가 할당(Allocation)되는 영역
- 대부분의 객체가 금방 Unreachable 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라진다.
- Young 영역에서 메모리가 회수되는 것을 Minor GC라고 부른다.
Old#
- Young영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
- Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생한다.
- Old 영역에 대한 메모리 회수는 Major GC 또는 Full GC라고 부른다.