打开ART虚拟机的大门| 青训营笔记

84 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第16天

文中截图多来源于字节跳动夏令营讲座课件与学习资料,若有侵权请联系删除,感激不尽

课程围绕两个思路展开:
1.对象是如何被分配出来的
2.为了保证代码高效执行,虚拟机应提供哪些机制


一.对象篇
pic1.png

对象生命旅程

一个类的大小为:父类,父类的父类…………直到迭代到Object所有成员的大小之和。
由此就可以发现,诶,那我的子类里如果用不到父类的某些属性,岂不是会浪费我的空间?所以便强调,要合理的继承抽象,减少空间的浪费。

注意到Android的内存分配并不直接由OS操控,而是托管给VM,ART分为三个分配器,分别给小,中,大的申请调度内存。

pic2.png

对于内存的管理都有一个一定逃不开的问题:内存碎片(内零头)。这里就不放图了大伙都应该都修过操作系统。
IOS采用RC方法(引用者计数,为0释放)。考虑到RC认不出环引用(两个孤立单位互相强引用)从而将这方面的编程负担交给了开发者,安卓采用了GC(定期系统监测回收垃圾)。
安卓中的强引用,软引用与弱引用如下:

a3.png

那什么时候系统会触发GC呢?

a4.png

所以安卓手机有时的卡顿可能就是因为触发了GC。RC的好处这个时候就体现出来了,及时释放,你都感觉不到。

GC的算法有两种:tracing GC和copying GC。 前者为从roots遍历所有有holders的对象,释放其他内存。
后者为遍历一个区域中所有有用的对象,集中复制到另一个区域内,再释放当前区域的所有内存。
二者差别如下:

faaa.png


二.执行篇
fff.png 后面的内容有点太深了,就,你懂的。