Android Art Gc - 概述

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-11 02:03:48

基于Android  Q源码:

1.GC 回收算法

GC目前只有四种基本方法:
(1)Mark-Sweep Collection 标记清除算法
(2)Copying Collection 复制算法
(3)Mark-Compact Collection 标记-压缩算法
(3)Reference Counting 引用计数算法--未被art采用
目前art默认使用的GC方案:
concurrent copying(CC) 并发复制算法

2.评价GC的指标

(1)吞吐量 throughput 管理的堆大小/GC总时长
(2)最大暂停时间 pause time 垃圾回收器运行时,应用程序的最大暂停时间
(3)堆(空间)使用效率 space overhead,决定堆使用效率因素:(1)头大小 (2)堆用法
             对象是GC的基本单位,对象由头(header)和域(field)构成
                    头:对象的大小,对象的种类
                    域:指针和非指针两种
(4)访问的局部性
其他指标
(5)垃圾回收器负载
(6)垃圾回收频率 垃圾回收器多长时间运行一次。一般而言,频率越低越好,通常增大堆空间可以有效降低垃圾回收发生的频率,但是会增加回收时产生的停顿时间。
(7)反应时间 当一个对象成为垃圾后,多长时间内,它所占用的内存空间会被释放掉。

3. Art 中的GC回收器类型和设置方法

(1)编译配置设置默认回收器:

在/art/build/art.go

39	gcType := envDefault(ctx, "ART_DEFAULT_GC_TYPE", "CMS")
40
41	if envTrue(ctx, "ART_TEST_DEBUG_GC") {
42		gcType = "SS"
43		tlab = true
44	}
45
46	cflags = append(cflags, "-DART_DEFAULT_GC_TYPE_IS_"+gcType)
47	if tlab {
48		cflags = append(cflags, "-DART_USE_TLAB=1")
49	}

默认回收器只支持CMS, SS, GSS, CC 四种,默认CMS

但是在heap创建的时候如果支持kUseReadBarrier,则会前台默认使用CC, 后台使用CCBackground ,目前是支持这个的,所以我们现在art用的是CC方案。

kUseReadBarrier ? gc::kCollectorTypeCC : xgc_option.collector_type_,
kUseReadBarrier ? BackgroundGcOption(gc::kCollectorTypeCCBackground)
: runtime_options.GetOrDefault(Opt::BackgroundGc),

static constexpr bool kUseReadBarrier =
kUseBakerReadBarrier || kUseBrooksReadBarrier || kUseTableLookupReadBarrier;

ART_USE_READ_BARRIER


 
ART_READ_BARRIER_TYPE_IS_BAKER

USE_BAKER_READ_BARRIER

kUseBakerReadBarrier = true
ART_READ_BARRIER_TYPE_IS_BROOKS

USE_BROOKS_READ_BARRIER

kUseBrooksReadBarrier=true
ART_READ_BARRIER_TYPE_IS_TABLELOOKUP

USE_TABLE_LOOKUP_READ_BARRIER

kUseTableLookupReadBarrier=true


(3)通过属性设置回收器

前台回收器设置方法:

GC类型设置,前提要把kUseReadBarrier的判断去掉由runtime传入的参数决定,更改前台 GC 计划的主要方法是更改 dalvik.vm.gctype 属性或传递 -Xgc: 选项

参数 -Xgc:  
属性值 dalvik.vm.gctype

后台回收器设置方法:

参数 -XX:BackgroundGC=

属性值  dalvik.vm.backgroundgctype

后台回收器的决定逻辑如下

art/runtime/parsed_options.cc

613    background_collector_type_ = args.GetOrDefault(M::BackgroundGc);
614    {
615      XGcOption* xgc = args.Get(M::GcOption);
616      if (xgc != nullptr && xgc->collector_type_ != gc::kCollectorTypeNone) {
617        collector_type_ = xgc->collector_type_;
618      }
619    }
620
621    if (background_collector_type_ == gc::kCollectorTypeNone) {
622      if (collector_type_ != gc::kCollectorTypeGSS) {
623        background_collector_type_ = low_memory_mode_ ?
624            gc::kCollectorTypeSS : gc::kCollectorTypeHomogeneousSpaceCompact;
625      } else {
626        background_collector_type_ = collector_type_;
627      }
628    }

1.前台 GSS,后台也是GSS

2.前台非GSS,低内存模式,后台为SS,非低内存模式后台为HSC

Collector Type

option

Comment (English)

comment

kCollectorTypeMS MS Non concurrent mark-sweep 非并发标记-清除
kCollectorTypeCMS CMS CMS Concurrent mark-sweep. 并发标记-清除
kCollectorTypeSS SS Semi-space / mark-sweep hybrid, enables compaction. 半空间压缩
kCollectorTypeGSS GSS A generational variant of kCollectorTypeSS 分代的半空间压缩
kCollectorTypeMC(Q已经移除)
MC
Mark compact collector 标记-压缩
kCollectorTypeHeapTrim   Heap trimming collector, doesn't do any actual collecting. 主要是使用TrimSpace函数进行消减空间对象空闲内存资源的时候传入的回收器类型,一般是heap trim触发的。
kCollectorTypeCC CC A (mostly) concurrent copying collector. 并发复制回收
kCollectorTypeCCBackground CCBackground The background compaction of the concurrent copying collector. 后台并发复制回收
kCollectorTypeInstrumentation   Instrumentation critical section fake collector.  
kCollectorTypeAddRemoveAppImageSpace   Fake collector for adding or removing application image spaces.  
kCollectorTypeDebugger   Fake collector used to implement exclusion between GC and debugger.  
kCollectorTypeHomogeneousSpaceCompact   A homogeneous space compaction collector used in background transition when both foreground and background collector are CMS. 同构空间压缩(HSC),用于后台回收器类型
kCollectorTypeClassLinker   Class linker fake collector.  
kCollectorTypeJitCodeCache   JIT Code cache fake collector.  
kCollectorTypeHprof   Hprof fake collector.  
kCollectorTypeAddRemoveSystemWeakHolder   Fake collector for installing/removing a system-weak holder.  
kCollectorTypeGetObjectsAllocated   Fake collector type for GetObjectsAllocated  
kCollectorTypeCriticalSection   Fake collector type for ScopedGCCriticalSection  

GcType

主要决定回收力度

GcType

comment

GcType

comment

kGcTypeSticky 只回收上次GC后在Allocation Space中新分配的垃圾对象
kGcTypePartial 只回收Allocation Space的垃圾对象
kGcTypeFull 同时回收Zygote Space和Allocation Space的垃圾对象
kGcTypeMax  


4.堆空间的划分

垃圾回收类型的不同也决定了heap内存区域有不同的划分。heap的内存管理是通过Space划分的,不同的Space功能是有区别的。

这里主要解释CC 回收器初始化的heap space 类型

ImageSpace 主要用来管理加载到内存中的art文件

Zygote Space Zygote进程的heap区

LargeObjeactSpace  主要管理存放大对象的内存区域

RegionSpace 常规内存对象的分配区域

5. 分配器

Allocator Type

内存分配器

分配策略

对象所在的堆空间

kAllocatorTypeRosAlloc
RosAlloc 分箱式分配 Main space
kAllocatorTypeTLAB
TLAB 线程私有分配区 Bump Pointer Space
kAllocatorTypeBumpPointer
BumpPointer 头尾相连分配 Bump Pointer Space
kAllocatorTypeDlMalloc
DlMalloc 分箱式分配 Main space
kAllocatorTypeNonMoving
NonMoving 不移动对象分配策略 Non-Moving Space
kAllocatorTypeLOS
LOS 专门分配大对象 Large Object Space
kAllocatorTypeRegion
Region
分域管理,顺序分配
Region Space
kAllocatorTypeRegionTLAB
RegionTLAB
线程私有的Region分配
Region Space
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!