这是我参与「第四届青训营 」笔记创作活动的第8天
对象篇
对象的生命旅程
- 对象分为一下几类
类管理
- 决定一个对象的大小和行为
类主要描述的是一个对象的内存布局和函数信息
内存布局:类成员的大小,类型,和排布
函数信息:主要是虚表的信息,某个承数定义在当前类承数表的第几个位置 动态性的来源:因为java是支持继承的,因此类的内存布局和函数虚表需要做继承链全展开以后才能真正确认。 - 基类objcet的秘密 定义:
3.类加载
一个类分配的对象大小,是由继承链决定的
JAVA的类,是在第一次使用的时候,才会进行加载
4.内存布局
5.双亲继承
本质上,双亲委派就是人为划定的一个规矩,目的是为了保证系统内同一个类的一致性
内存分配
- 分配器
APP的java对象内存分配上是托管到VM来处理的,并不会直接向操作系统去申请,实际上对OS内存的占用和内存布局,是VM控制的
2.内存碎片
ART内存分配的根本原理,还是给使用者在最优的范围内找到一块大小符合的连续内存
内存回收
- 两种思路
GC:垃圾回收(Garbage Collection),需要定期查找系统内不用的对象,并且释放占用的内存
RC:引用计数(Reference Counting),指的是对一个对象引用进行计数,多一个引用者,就+1,少一个就-1,为0就释放 典型的如IOS的swift就使用RC进行内存管理
- RC的问题和解决
- 触发GC的条件
- copy GC
- tracing GC
执行篇
虚拟机的执行方式
- JIT
- OAT
OAT(或者AOT),和川不同,是在程序运行之前,对APK中的函数进行编译。
1.和程序是否运行无关
2.编译的范围不是以函数为单位,而是以dex为单位的。
3.结果会持久化。 - 延迟绑定 绑定的越迟,动态性越好,性能越差;绑定的越早,动态性越差,性能越好
栈管理
1.压栈-出栈的速度不同,解释执行的速度慢
2.解释执行的栈结构是托管的,编译执行的栈结构是遵从虚拟机规则的
3.解释执行传递参数有额外的空间成本,编译执行没有
4.不同执行方式之间调用切换采用trampoline/bridge进行
今日学习总结
今天的课程十分有趣,内容丰富,但是最后的执行篇的异常处理没太明白,日后会多加练习。
注
所有图片均出自课程PPT