这是我参与「第四届青训营 」笔记创作活动的第16天
文中截图多来源于字节跳动夏令营讲座课件与学习资料,若有侵权请联系删除,感激不尽
课程围绕两个思路展开:
1.对象是如何被分配出来的
2.为了保证代码高效执行,虚拟机应提供哪些机制
一.对象篇
对象生命旅程
一个类的大小为:父类,父类的父类…………直到迭代到Object所有成员的大小之和。
由此就可以发现,诶,那我的子类里如果用不到父类的某些属性,岂不是会浪费我的空间?所以便强调,要合理的继承抽象,减少空间的浪费。
注意到Android的内存分配并不直接由OS操控,而是托管给VM,ART分为三个分配器,分别给小,中,大的申请调度内存。
对于内存的管理都有一个一定逃不开的问题:内存碎片(内零头)。这里就不放图了大伙都应该都修过操作系统。
IOS采用RC方法(引用者计数,为0释放)。考虑到RC认不出环引用(两个孤立单位互相强引用)从而将这方面的编程负担交给了开发者,安卓采用了GC(定期系统监测回收垃圾)。
安卓中的强引用,软引用与弱引用如下:
那什么时候系统会触发GC呢?
所以安卓手机有时的卡顿可能就是因为触发了GC。RC的好处这个时候就体现出来了,及时释放,你都感觉不到。
GC的算法有两种:tracing GC和copying GC。
前者为从roots遍历所有有holders的对象,释放其他内存。
后者为遍历一个区域中所有有用的对象,集中复制到另一个区域内,再释放当前区域的所有内存。
二者差别如下:
二.执行篇
后面的内容有点太深了,就,你懂的。