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

82 阅读2分钟

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

1.对象篇

对象的生命旅程

fa8ac5ee-0cd6-4900-ad8d-99e2154d0efd.png 类管理:主要描述一个对象的内存布局与函数信息

内存布局:类成员的大小,类型和排布

函数信息:主要为虚表信息:某一个函数定义在当前类函数表的第几个位置

因为java支持继承,因此均需要做继承链全展开以后才能真正确认(动态性来源)

基类object的秘密

9403b4dc-c395-4570-9d88-ed6742ad6ab4.png

04553b02-2f5f-4436-bb39-546e6fb56b98.png 类加载:一个类对象的大小是由继承链决定的,java的类是在第一次使用的时候才会加载

内存布局

ed3a6ddc-af3b-4f21-a097-de1f6aae46c5.png

双亲继承:为保证系统内同一个类的一致性

合理的继承抽象的好处:优雅架构

内存分配

分配器:APP的java对象内存分配上是托管到VM来处理的,并不会直接向操作系统去申请,实际上对OS内存的占用和内存布局,是VM控制的(预留-扩展)

内存碎片

bff19cf8-8213-40ba-be7f-de1bb86d7ade.png 内存回收

GC:垃圾回收(Garbage Collection),需要定期查找系统内不用的对象,并且释放占用的内存

RC:引用计数(Reference Counting),指的是对一个对象引用进行计数,多一个引用者,就+1,少一个就-1,为0就释放典型的如IOS的swift就使用RC进行内存管理

虚拟机的执行方式

下载.png 栈管理

1.压栈-出栈的速度不同,解释执行的速度慢

2.解释执行的栈结构是托管的,编译执行的栈结构是遵从虚拟机规则的

3.解释执行传递参数有额外的空间成本,编译执行没有

4.不同执行方式之间调用切换采用trampoline/bridge进行