ART虚拟机|青训营笔记

122 阅读2分钟

这是我参与[第四届青训营]笔记创作的第 32 天

对象篇

对象是什么--JAVA类的管理

对象从哪里来--内存分配

对象:对象分配(分配多大-类;怎么分配-内存管理),对象使用(执行类的方法,访问对象成员),对象销毁(内存回收--GC,清理)
类型管理决定一个对象的大小和行为
类主要描述的是一个对象的内存布局和函数信息
内存布局:类成员的大小,类型和排布
函数信息:主要是虚表的信息,某个函数定义在当前类函数表的第几个位置

public class Object{
    private transient Class<?> shadow$_klass_;
    private transient int shadow$_monitor_;
  
  art::mirror::Object对象 klass_:4字节,一个指针,指向该对象所属类的类对象
                          monitor_:4字节,存储了hash code和锁信息

对象到哪里去--内存回收

GC:垃圾回收:需要定期查找系统内不用的对象,并且释放占用的内存(触发:内内存,该GC了(:VM堆占用达到水位,系统内存紧张,任性))
RC:引用计数,指的是对一个对象引用进行计数,多一个引用者,就+1,少一个就-1,为0就释放(IOS)
ART引用
强引用:直接持有的引用就是强引用(不能动)
软引用:内存不够的时候会回收
弱引用:只要触发GC就会被回收
GC roots的概念:怎么判断那些内存是有用的那些是没用的
这些是正在用,不能被释放:栈,static变量,native ref ,vm保留
前台GC,速度快
后台GC,速度慢
内存释放:finalize方法一般用来跟随对象的生命周期,清理掉绑定的native资源(只会执行一次)

执行篇

虚拟机的执行方式

执行方式:解释执行-dex code(APK),JIT(运行时做的)-profile-JIT complie-JIT code,AOT(运行以前做的)-speed-profile-dex2oat-AOT code
JIT:先通过解释执行选出最受欢迎的函数交给导师组特训,结果持久化 OSR
OAT:对APK中的函数进行编译,和程序是否运行无关,编译的范围是以ex为单位,结果会持久化。
延迟绑定:绑定的越迟,动态性越好,性能越差;绑定的越早,动态性越差,性能越好。只有在端侧才能获取到自己类的完整信息

开始和结束--JAVA栈管理

ART对于解释执行和编译后指令
1,对解释执行,栈托管到虚拟机完成
2,对于编译后,压栈处理和native代码一样,遵从对应指令集的约定\

高效的执行--多线程

synchronize
monitor :保存Object指针,胖锁(省力,但反应慢,实现上采用mutexlock),瘦锁(费劲,但响应快,实现上采用spinlock)。胖瘦锁切换。