2.3 GC的类型
- GC_FOR_MALLOC: 表示是在堆上分派对象时内存不足触发的GC。
- GC_CONCURRENT: 当我们应用法度榜样的堆内存达到必定量,或者可以懂得为将近满的时刻,体系会主动触发GC操作来释放内存。
- GC_EXPLICIT: 表示是应用法度榜样调用System.gc、VMRuntime.gc接口或者收到SIGUSR1旌旗灯号时触发的GC。
- GC_BEFORE_OOM: 表示是在预备抛OOM异常之进步行的最后尽力而触发的GC。
实际上,GC_FOR_MALLOC、GC_CONCURRENT和GC_BEFORE_OOM三种类型的GC都是在分派对象的过程触发的。而并发和非并发GC的差别重要在于前者在GC过程中,有前提地挂起和唤醒非GC线程,而后者在履行GC的过程中,一向都是挂刮风GC线程的。并行GC经由过程有前提地挂起和唤醒非GC线程,就可以使得应用法度榜样获得更好的响应性。然则同时并行GC须要多履行一次标记根集对象以及递归标记那些在GC过程被拜访了的对象的操作,所以也须要花费更多的CPU资本。后文在Art的并发和非并发GC中我们也会侧重颂峦宦这两者的差别。
2.4 对象的分派和GC触发机会
- 调用函数dvmHeapSourceAlloc在Java堆上分派指定大年夜小的内存。如不雅分派成功,那么就将分派获得的地址直接返回给调用者了。函数dvmHeapSourceAlloc在不改变Java堆当前大年夜小的前提下进行内存分派,这是属于轻量级的内存分派动作。
- 如不雅上一步内存分派掉败,这时刻就须要履行一次GC了。不过如不雅GC线程已经在运行中,即gDvm.gcHeap->gcRunning的值等于true,那么就直接调用函数dvmWaitForConcurrentGcToComplete比及GC履行完成就是了。不然的话,就须要调用函数gcForMalloc来履行一次GC了,参数false表示不要收受接收软引用对象引用的对象。
- GC履行完毕后,再次调用函数dvmHeapSourceAlloc测验测验轻量级的内存分派操作。如不雅分派成功,那么就将分派获得的地址直接返回给调用者了。
- 如不雅上一步内存分派掉败,这时刻就得推敲先将Java堆的当前大年夜小设置为Dalvik虚拟机启动时指定的Java堆最大年夜值,再进行内存分派了。这是经由过程调用函数dvmHeapSourceAllocAndGrow来实现的。
- 如不雅调用函数dvmHeapSourceAllocAndGrow分派内存成功,则直接将分派获得的地址直接返回给调用者了。
- 如不雅上一步内存分派照样掉败,这时刻就得出狠招了。再次调用函数gcForMalloc来履行GC。参数true表示要收受接收软引用对象引用的对象。
- GC履行完毕,再次调用函数dvmHeapSourceAllocAndGrow进行内存分派。这是最后一次尽力了,成功与事都到此为止。
示例图如下:
经由过程这个流程可以看到,在对象的分派中会导致GC,第一次分派对象掉败我们会触发GC然则不收受接收Soft的引用,如不雅再次分派照样掉败我们就会将Soft的内存也给收受接收,前者触发的GC是GC_FOR_MALLOC类型的GC,后者是GC_BEFORE_OOM类型的GC。而当内存分派成功后,我们会断定当前的内存占用是否是达到了GC_CONCURRENT的阀值,如不雅达到了那么竽暌怪会触发GC_CONCURRENT。
2.5 收受接收算法和内存碎片
主流的大年夜部分Davik采取的都是标注与清理(Mark and Sweep)收受接收算法,也有实现了拷贝GC的,这一点和HotSpot是不一样的,具体应用什么算法是在编译期决定的,无法在运行的时刻动态改换。如不雅在编译dalvik虚拟机的敕令中指清楚明了”WITH_COPYING_GC”选项,则编译”/dalvik/vm/alloc/Copying.cpp”源码 – 此是Android中拷贝GC算法的实现,不然编译”/dalvik/vm/alloc/HeapSource.cpp” – 其实现了标注与清理GC算法。
因为Mark and Sweep算法的缺点,轻易导致内存碎片,所以在这个算法下,当我们有大年夜量不持续小内存的时刻,再分派一个较大年夜对象时,照样会异常轻易导致GC,比如我们在该手机上decode图片,具体情况如下:
所以对于Dalvik虚拟机的手机来说,我们起重要尽量避免掉落频蕃殖成很多临时小变量(比如说:getView,onDraw等函数),另一个又要尽量去避免产生很多长生命周期的大年夜对象。
3、ART内存收受接收机制
【编辑推荐】
- Android仿华为气象绘制刻度盘
- Android中的IPC机制
- 一个简单实用的Android调试应用技能
- Android模块化摸索与实践
- Android自定义BaseAdapter最佳实践
ART运行时内部应用的Java堆的重要构成包含Image Space、Zygote Space、Allocation Space和Large Object Space四个Space,Image Space用来存在一些预加载的类, Zygote Space和Allocation Space与Dalvik虚拟机垃收受接收集机制中的Zygote堆和Active堆的感化是一样的,
鄙人文的GC Log中,我们也能看到在art的GC Log中包含了LOS的信息,便利我们查看大年夜内存的情况。
3.2 GC的类型
- kGcCauseForAlloc ,当要分派内存的时刻发明内存不敷的情况下引起的GC,这种情况下的GC会stop world
- kGcCauseBackground,当内存达到必定的阀值的时刻会去出发GC,这个时刻是一个后台gc,不会引起stop world
- kGcCauseExplicit,显示调用的时刻进行的gc,如不雅art打开了这个选项的情况下,在system.gc的时刻会进行gc
- 其他更多
3.3 对象的分派和GC触发机会
推荐阅读
“互联网+”已深刻社会各范畴,有“综合工业之冠”的船舶业袈溱物联网、大年夜数据、云计算等技巧的影响下,传统基本举措措施和立异要素日益变更,行业生态体系和成长>>>详细阅读 本文标题:Android GC原理探究 地址:http://www.17bianji.com/lsqh/35313.html 1/2 1