对象的实例化、内存布局
对象创建的方式
- new
- Class 的newInstance() :反射的方式
- Constructor 的newInstance(Xxxx) :反射的方式
- clone():不调用构造器,但是要实现Cloneable()接口
- 使用返序列化:
- 第三方库
对象创建的步骤
1、判断对象对应的类是否加载、链接、初始化
2、为对象分配内存,
3、处理并发安全问题
4、初始化分配到空间
5、设置对象的对象头
6、执行init()方法进行初始化
对象的内存布局
对象的访问引用
思考:JVM是如何通过栈帧中的对象引用访问到其内部的实例对象呢
答:对象引用指向堆区,堆区内部的类型指针指向方法区内部的对象
执行引擎
任务是将字节码指令解释、编译为对应平台上的本地机器指令。
执行引擎执行PC寄存器指向操作数栈中的指令。pc寄存器指向哪,执行引擎就在哪执行。
执行引擎运行有两种方式运行代码。
解释器
将字节码文件中的内容翻译成对应的本地平台机器指令。
效率低下
即时编译器(JIT)
将整个函数体编译成为机器码,每次函数执行时,只执行编译后的机器码即可。
速度快
为什么即时编译器执行速度快为什么还保留解释器呢?
程序运行后,解释器可以立马发挥作用,省去编译时间,立即执行。响应速度快
而JIT编译器需要将代码编译成本地机器指令。执行速度快
于是:在程序开始运行后,由解释器执行代码,提高响应速度。运行一段时间后,通过热点代码探测。将热点代码通过即时编译器解释成本地代码运行。